blob: 0e11c994c0490680c95df43b1d981147d7a15d10 [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"
23
Alec Mouri16a99402019-07-29 16:37:30 -070024#include <chrono>
25#include <condition_variable>
Vishnu Nair16efdbf2019-12-10 11:55:42 -080026#include <fstream>
Alec Mouri6e57f682018-09-29 20:45:08 -070027
Lucas Dupin19c8f0e2019-11-25 17:55:44 -080028#include <cutils/properties.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080029#include <gtest/gtest.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070030#include <renderengine/RenderEngine.h>
Alec Mouri1089aed2018-10-25 21:33:57 -070031#include <sync/sync.h>
Alec Mouri6e57f682018-09-29 20:45:08 -070032#include <ui/PixelFormat.h>
Alec Mourid43ccab2019-03-13 12:23:45 -070033#include "../gl/GLESRenderEngine.h"
Ana Krulec9bc9dc62020-02-26 12:16:40 -080034#include "../threaded/RenderEngineThreaded.h"
Alec Mouri6e57f682018-09-29 20:45:08 -070035
Alec Mouri1089aed2018-10-25 21:33:57 -070036constexpr int DEFAULT_DISPLAY_WIDTH = 128;
37constexpr int DEFAULT_DISPLAY_HEIGHT = 256;
38constexpr int DEFAULT_DISPLAY_OFFSET = 64;
Vishnu Nair16efdbf2019-12-10 11:55:42 -080039constexpr bool WRITE_BUFFER_TO_FILE_ON_FAILURE = false;
Alec Mouri1089aed2018-10-25 21:33:57 -070040
Alec Mouri6e57f682018-09-29 20:45:08 -070041namespace android {
42
Ana Krulec82ba2ec2020-11-21 13:33:20 -080043class RenderEngineFactory {
44public:
45 virtual ~RenderEngineFactory() = default;
46
47 virtual std::string name() = 0;
48 virtual std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() = 0;
49};
50
51class GLESRenderEngineFactory : public RenderEngineFactory {
52public:
53 std::string name() override { return "GLESRenderEngineFactory"; }
54
55 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
KaiChieh Chuang436fc192020-09-07 13:48:42 +080056 renderengine::RenderEngineCreationArgs reCreationArgs =
Peiyong Lin4137a1d2019-10-09 10:39:09 -070057 renderengine::RenderEngineCreationArgs::Builder()
Ana Krulec9bc9dc62020-02-26 12:16:40 -080058 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
59 .setImageCacheSize(1)
60 .setUseColorManagerment(false)
61 .setEnableProtectedContext(false)
62 .setPrecacheToneMapperShaderOnly(false)
63 .setSupportsBackgroundBlur(true)
64 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
65 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::GLES)
KaiChieh Chuang436fc192020-09-07 13:48:42 +080066 .build();
Ana Krulec82ba2ec2020-11-21 13:33:20 -080067 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
Alec Mourid43ccab2019-03-13 12:23:45 -070068 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -080069};
Alec Mourid43ccab2019-03-13 12:23:45 -070070
Ana Krulecaa2fe7f2020-11-24 15:06:36 -080071class GLESCMRenderEngineFactory : public RenderEngineFactory {
72public:
73 std::string name() override { return "GLESCMRenderEngineFactory"; }
74
75 std::unique_ptr<renderengine::gl::GLESRenderEngine> createRenderEngine() override {
76 renderengine::RenderEngineCreationArgs reCreationArgs =
77 renderengine::RenderEngineCreationArgs::Builder()
78 .setPixelFormat(static_cast<int>(ui::PixelFormat::RGBA_8888))
79 .setImageCacheSize(1)
80 .setEnableProtectedContext(false)
81 .setPrecacheToneMapperShaderOnly(false)
82 .setSupportsBackgroundBlur(true)
83 .setContextPriority(renderengine::RenderEngine::ContextPriority::MEDIUM)
84 .setRenderEngineType(renderengine::RenderEngine::RenderEngineType::GLES)
85 .setUseColorManagerment(true)
86 .build();
87 return renderengine::gl::GLESRenderEngine::create(reCreationArgs);
88 }
89};
90
Ana Krulec82ba2ec2020-11-21 13:33:20 -080091class RenderEngineTest : public ::testing::TestWithParam<std::shared_ptr<RenderEngineFactory>> {
92public:
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080093 static sp<GraphicBuffer> allocateDefaultBuffer() {
Alec Mouri1089aed2018-10-25 21:33:57 -070094 return new GraphicBuffer(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT,
95 HAL_PIXEL_FORMAT_RGBA_8888, 1,
Alec Mouri0d5e1eb2018-11-10 20:40:12 -080096 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
97 GRALLOC_USAGE_HW_RENDER,
Alec Mouri1089aed2018-10-25 21:33:57 -070098 "output");
Alec Mouri6e57f682018-09-29 20:45:08 -070099 }
100
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800101 // Allocates a 1x1 buffer to fill with a solid color
102 static sp<GraphicBuffer> allocateSourceBuffer(uint32_t width, uint32_t height) {
103 return new GraphicBuffer(width, height, HAL_PIXEL_FORMAT_RGBA_8888, 1,
104 GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN |
105 GRALLOC_USAGE_HW_TEXTURE,
106 "input");
107 }
108
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800109 RenderEngineTest() {
110 const ::testing::TestInfo* const test_info =
111 ::testing::UnitTest::GetInstance()->current_test_info();
112 ALOGD("**** Setting up for %s.%s\n", test_info->test_case_name(), test_info->name());
113 mBuffer = allocateDefaultBuffer();
114 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700115
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800116 ~RenderEngineTest() {
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800117 if (WRITE_BUFFER_TO_FILE_ON_FAILURE && ::testing::Test::HasFailure()) {
118 writeBufferToFile("/data/texture_out_");
119 }
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800120 for (uint32_t texName : mTexNames) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800121 mRE->deleteTextures(1, &texName);
122 EXPECT_FALSE(mRE->isTextureNameKnownForTesting(texName));
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800123 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800124 const ::testing::TestInfo* const test_info =
125 ::testing::UnitTest::GetInstance()->current_test_info();
126 ALOGD("**** Tearing down after %s.%s\n", test_info->test_case_name(), test_info->name());
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800127 }
128
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800129 void writeBufferToFile(const char* basename) {
130 std::string filename(basename);
131 filename.append(::testing::UnitTest::GetInstance()->current_test_info()->name());
132 filename.append(".ppm");
133 std::ofstream file(filename.c_str(), std::ios::binary);
134 if (!file.is_open()) {
135 ALOGE("Unable to open file: %s", filename.c_str());
136 ALOGE("You may need to do: \"adb shell setenforce 0\" to enable "
137 "surfaceflinger to write debug images");
138 return;
139 }
140
Alec Mouri1089aed2018-10-25 21:33:57 -0700141 uint8_t* pixels;
142 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
143 reinterpret_cast<void**>(&pixels));
144
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800145 file << "P6\n";
146 file << mBuffer->getWidth() << "\n";
147 file << mBuffer->getHeight() << "\n";
148 file << 255 << "\n";
149
150 std::vector<uint8_t> outBuffer(mBuffer->getWidth() * mBuffer->getHeight() * 3);
151 auto outPtr = reinterpret_cast<uint8_t*>(outBuffer.data());
152
153 for (int32_t j = 0; j < mBuffer->getHeight(); j++) {
154 const uint8_t* src = pixels + (mBuffer->getStride() * j) * 4;
155 for (int32_t i = 0; i < mBuffer->getWidth(); i++) {
156 // Only copy R, G and B components
157 outPtr[0] = src[0];
158 outPtr[1] = src[1];
159 outPtr[2] = src[2];
160 outPtr += 3;
161
162 src += 4;
163 }
164 }
165 file.write(reinterpret_cast<char*>(outBuffer.data()), outBuffer.size());
166 mBuffer->unlock();
167 }
168
169 void expectBufferColor(const Region& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a) {
170 size_t c;
171 Rect const* rect = region.getArray(&c);
172 for (size_t i = 0; i < c; i++, rect++) {
173 expectBufferColor(*rect, r, g, b, a);
174 }
175 }
176
177 void expectBufferColor(const Rect& rect, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
178 uint8_t tolerance = 0) {
179 auto colorCompare = [tolerance](const uint8_t* colorA, const uint8_t* colorB) {
180 auto colorBitCompare = [tolerance](uint8_t a, uint8_t b) {
181 uint8_t tmp = a >= b ? a - b : b - a;
182 return tmp <= tolerance;
183 };
184 return std::equal(colorA, colorA + 4, colorB, colorBitCompare);
Alec Mouri1089aed2018-10-25 21:33:57 -0700185 };
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800186
187 expectBufferColor(rect, r, g, b, a, colorCompare);
188 }
189
190 void expectBufferColor(const Rect& region, uint8_t r, uint8_t g, uint8_t b, uint8_t a,
191 std::function<bool(const uint8_t* a, const uint8_t* b)> colorCompare) {
192 uint8_t* pixels;
193 mBuffer->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
194 reinterpret_cast<void**>(&pixels));
Alec Mouri1089aed2018-10-25 21:33:57 -0700195 int32_t maxFails = 10;
196 int32_t fails = 0;
197 for (int32_t j = 0; j < region.getHeight(); j++) {
198 const uint8_t* src =
199 pixels + (mBuffer->getStride() * (region.top + j) + region.left) * 4;
200 for (int32_t i = 0; i < region.getWidth(); i++) {
201 const uint8_t expected[4] = {r, g, b, a};
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800202 bool equal = colorCompare(src, expected);
Alec Mouri1089aed2018-10-25 21:33:57 -0700203 EXPECT_TRUE(equal)
204 << "pixel @ (" << region.left + i << ", " << region.top + j << "): "
205 << "expected (" << static_cast<uint32_t>(r) << ", "
206 << static_cast<uint32_t>(g) << ", " << static_cast<uint32_t>(b) << ", "
207 << static_cast<uint32_t>(a) << "), "
208 << "got (" << static_cast<uint32_t>(src[0]) << ", "
209 << static_cast<uint32_t>(src[1]) << ", " << static_cast<uint32_t>(src[2])
210 << ", " << static_cast<uint32_t>(src[3]) << ")";
211 src += 4;
212 if (!equal && ++fails >= maxFails) {
213 break;
214 }
215 }
216 if (fails >= maxFails) {
217 break;
218 }
219 }
220 mBuffer->unlock();
221 }
222
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800223 void expectAlpha(const Rect& rect, uint8_t a) {
224 auto colorCompare = [](const uint8_t* colorA, const uint8_t* colorB) {
225 return colorA[3] == colorB[3];
226 };
227 expectBufferColor(rect, 0.0f /* r */, 0.0f /*g */, 0.0f /* b */, a, colorCompare);
228 }
229
230 void expectShadowColor(const renderengine::LayerSettings& castingLayer,
231 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
232 const ubyte4& backgroundColor) {
233 const Rect casterRect(castingLayer.geometry.boundaries);
234 Region casterRegion = Region(casterRect);
235 const float casterCornerRadius = castingLayer.geometry.roundedCornersRadius;
236 if (casterCornerRadius > 0.0f) {
237 // ignore the corners if a corner radius is set
238 Rect cornerRect(casterCornerRadius, casterCornerRadius);
239 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.left, casterRect.top));
240 casterRegion.subtractSelf(
241 cornerRect.offsetTo(casterRect.right - casterCornerRadius, casterRect.top));
242 casterRegion.subtractSelf(
243 cornerRect.offsetTo(casterRect.left, casterRect.bottom - casterCornerRadius));
244 casterRegion.subtractSelf(cornerRect.offsetTo(casterRect.right - casterCornerRadius,
245 casterRect.bottom - casterCornerRadius));
246 }
247
248 const float shadowInset = shadow.length * -1.0f;
249 const Rect casterWithShadow =
250 Rect(casterRect).inset(shadowInset, shadowInset, shadowInset, shadowInset);
251 const Region shadowRegion = Region(casterWithShadow).subtractSelf(casterRect);
252 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
253
254 // verify casting layer
255 expectBufferColor(casterRegion, casterColor.r, casterColor.g, casterColor.b, casterColor.a);
256
257 // verify shadows by testing just the alpha since its difficult to validate the shadow color
258 size_t c;
259 Rect const* r = shadowRegion.getArray(&c);
260 for (size_t i = 0; i < c; i++, r++) {
261 expectAlpha(*r, 255);
262 }
263
264 // verify background
265 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
266 backgroundColor.a);
267 }
268
269 static renderengine::ShadowSettings getShadowSettings(const vec2& casterPos, float shadowLength,
270 bool casterIsTranslucent) {
271 renderengine::ShadowSettings shadow;
272 shadow.ambientColor = {0.0f, 0.0f, 0.0f, 0.039f};
273 shadow.spotColor = {0.0f, 0.0f, 0.0f, 0.19f};
274 shadow.lightPos = vec3(casterPos.x, casterPos.y, 0);
275 shadow.lightRadius = 0.0f;
276 shadow.length = shadowLength;
277 shadow.casterIsTranslucent = casterIsTranslucent;
278 return shadow;
279 }
280
Alec Mouri1089aed2018-10-25 21:33:57 -0700281 static Rect fullscreenRect() { return Rect(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT); }
282
283 static Rect offsetRect() {
284 return Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
285 DEFAULT_DISPLAY_HEIGHT);
286 }
287
288 static Rect offsetRectAtZero() {
289 return Rect(DEFAULT_DISPLAY_WIDTH - DEFAULT_DISPLAY_OFFSET,
290 DEFAULT_DISPLAY_HEIGHT - DEFAULT_DISPLAY_OFFSET);
291 }
292
Alec Mourid43ccab2019-03-13 12:23:45 -0700293 void invokeDraw(renderengine::DisplaySettings settings,
Vishnu Nair9b079a22020-01-21 14:36:08 -0800294 std::vector<const renderengine::LayerSettings*> layers,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800295 sp<GraphicBuffer> buffer) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700296 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800297 status_t status =
298 mRE->drawLayers(settings, layers, buffer, true, base::unique_fd(), &fence);
299 mCurrentBuffer = buffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700300
301 int fd = fence.release();
302 if (fd >= 0) {
303 sync_wait(fd, -1);
304 close(fd);
305 }
306
307 ASSERT_EQ(NO_ERROR, status);
Alec Mourid43ccab2019-03-13 12:23:45 -0700308 if (layers.size() > 0) {
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800309 ASSERT_TRUE(mRE->isFramebufferImageCachedForTesting(buffer->getId()));
Alec Mourid43ccab2019-03-13 12:23:45 -0700310 }
Alec Mouri1089aed2018-10-25 21:33:57 -0700311 }
312
Alec Mourid43ccab2019-03-13 12:23:45 -0700313 void drawEmptyLayers() {
Alec Mouri6e57f682018-09-29 20:45:08 -0700314 renderengine::DisplaySettings settings;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800315 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri6e57f682018-09-29 20:45:08 -0700316 // Meaningless buffer since we don't do any drawing
317 sp<GraphicBuffer> buffer = new GraphicBuffer();
Alec Mouri1089aed2018-10-25 21:33:57 -0700318 invokeDraw(settings, layers, buffer);
Alec Mouri6e57f682018-09-29 20:45:08 -0700319 }
320
Alec Mouri1089aed2018-10-25 21:33:57 -0700321 template <typename SourceVariant>
322 void fillBuffer(half r, half g, half b, half a);
323
324 template <typename SourceVariant>
325 void fillRedBuffer();
326
327 template <typename SourceVariant>
328 void fillGreenBuffer();
329
330 template <typename SourceVariant>
331 void fillBlueBuffer();
332
333 template <typename SourceVariant>
334 void fillRedTransparentBuffer();
335
336 template <typename SourceVariant>
337 void fillRedOffsetBuffer();
338
339 template <typename SourceVariant>
340 void fillBufferPhysicalOffset();
341
342 template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700343 void fillBufferCheckers(uint32_t rotation);
Alec Mouri1089aed2018-10-25 21:33:57 -0700344
345 template <typename SourceVariant>
346 void fillBufferCheckersRotate0();
347
348 template <typename SourceVariant>
349 void fillBufferCheckersRotate90();
350
351 template <typename SourceVariant>
352 void fillBufferCheckersRotate180();
353
354 template <typename SourceVariant>
355 void fillBufferCheckersRotate270();
356
357 template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800358 void fillBufferWithLayerTransform();
359
360 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700361 void fillBufferLayerTransform();
362
363 template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800364 void fillBufferWithColorTransform();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800365
366 template <typename SourceVariant>
Alec Mouri1089aed2018-10-25 21:33:57 -0700367 void fillBufferColorTransform();
368
Alec Mouri7c94edb2018-12-03 21:23:26 -0800369 template <typename SourceVariant>
370 void fillRedBufferWithRoundedCorners();
371
372 template <typename SourceVariant>
373 void fillBufferWithRoundedCorners();
374
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000375 template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800376 void fillBufferAndBlurBackground();
377
378 template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000379 void overlayCorners();
380
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800381 void fillRedBufferTextureTransform();
382
383 void fillBufferTextureTransform();
384
385 void fillRedBufferWithPremultiplyAlpha();
386
387 void fillBufferWithPremultiplyAlpha();
388
389 void fillRedBufferWithoutPremultiplyAlpha();
390
391 void fillBufferWithoutPremultiplyAlpha();
392
Alec Mouriac335532018-11-12 15:01:33 -0800393 void fillGreenColorBufferThenClearRegion();
394
395 void clearLeftRegion();
396
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000397 void clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -0800398
Vishnu Nair16efdbf2019-12-10 11:55:42 -0800399 template <typename SourceVariant>
400 void drawShadow(const renderengine::LayerSettings& castingLayer,
401 const renderengine::ShadowSettings& shadow, const ubyte4& casterColor,
402 const ubyte4& backgroundColor);
403
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800404 std::unique_ptr<renderengine::gl::GLESRenderEngine> mRE;
405
Alec Mourid43ccab2019-03-13 12:23:45 -0700406 // Dumb hack to avoid NPE in the EGL driver: the GraphicBuffer needs to
407 // be freed *after* RenderEngine is destroyed, so that the EGL image is
408 // destroyed first.
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800409 sp<GraphicBuffer> mCurrentBuffer;
Alec Mouri1089aed2018-10-25 21:33:57 -0700410
411 sp<GraphicBuffer> mBuffer;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800412
413 std::vector<uint32_t> mTexNames;
Alec Mouri6e57f682018-09-29 20:45:08 -0700414};
415
Alec Mouri1089aed2018-10-25 21:33:57 -0700416struct ColorSourceVariant {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800417 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800418 RenderEngineTest* /*fixture*/) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700419 layer.source.solidColor = half3(r, g, b);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800420 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700421 }
422};
423
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800424struct RelaxOpaqueBufferVariant {
425 static void setOpaqueBit(renderengine::LayerSettings& layer) {
426 layer.source.buffer.isOpaque = false;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800427 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800428 }
429
430 static uint8_t getAlphaChannel() { return 255; }
431};
432
433struct ForceOpaqueBufferVariant {
434 static void setOpaqueBit(renderengine::LayerSettings& layer) {
435 layer.source.buffer.isOpaque = true;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800436 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800437 }
438
439 static uint8_t getAlphaChannel() {
440 // The isOpaque bit will override the alpha channel, so this should be
441 // arbitrary.
442 return 10;
443 }
444};
445
446template <typename OpaquenessVariant>
447struct BufferSourceVariant {
448 static void fillColor(renderengine::LayerSettings& layer, half r, half g, half b,
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800449 RenderEngineTest* fixture) {
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800450 sp<GraphicBuffer> buf = RenderEngineTest::allocateSourceBuffer(1, 1);
451 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800452 fixture->mRE->genTextures(1, &texName);
453 fixture->mTexNames.push_back(texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800454
455 uint8_t* pixels;
456 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
457 reinterpret_cast<void**>(&pixels));
458
459 for (int32_t j = 0; j < buf->getHeight(); j++) {
460 uint8_t* iter = pixels + (buf->getStride() * j) * 4;
461 for (int32_t i = 0; i < buf->getWidth(); i++) {
462 iter[0] = uint8_t(r * 255);
463 iter[1] = uint8_t(g * 255);
464 iter[2] = uint8_t(b * 255);
465 iter[3] = OpaquenessVariant::getAlphaChannel();
466 iter += 4;
467 }
468 }
469
470 buf->unlock();
471
472 layer.source.buffer.buffer = buf;
473 layer.source.buffer.textureName = texName;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800474 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800475 OpaquenessVariant::setOpaqueBit(layer);
476 }
477};
478
Alec Mouri1089aed2018-10-25 21:33:57 -0700479template <typename SourceVariant>
480void RenderEngineTest::fillBuffer(half r, half g, half b, half a) {
481 renderengine::DisplaySettings settings;
482 settings.physicalDisplay = fullscreenRect();
483 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800484 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700485
Vishnu Nair9b079a22020-01-21 14:36:08 -0800486 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700487
488 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800489 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700490 layer.geometry.boundaries = fullscreenRect().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800491 SourceVariant::fillColor(layer, r, g, b, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700492 layer.alpha = a;
493
Vishnu Nair9b079a22020-01-21 14:36:08 -0800494 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700495
496 invokeDraw(settings, layers, mBuffer);
497}
498
499template <typename SourceVariant>
500void RenderEngineTest::fillRedBuffer() {
501 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, 1.0f);
502 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
503}
504
505template <typename SourceVariant>
506void RenderEngineTest::fillGreenBuffer() {
507 fillBuffer<SourceVariant>(0.0f, 1.0f, 0.0f, 1.0f);
508 expectBufferColor(fullscreenRect(), 0, 255, 0, 255);
509}
510
511template <typename SourceVariant>
512void RenderEngineTest::fillBlueBuffer() {
513 fillBuffer<SourceVariant>(0.0f, 0.0f, 1.0f, 1.0f);
514 expectBufferColor(fullscreenRect(), 0, 0, 255, 255);
515}
516
517template <typename SourceVariant>
518void RenderEngineTest::fillRedTransparentBuffer() {
519 fillBuffer<SourceVariant>(1.0f, 0.0f, 0.0f, .2f);
520 expectBufferColor(fullscreenRect(), 51, 0, 0, 51);
521}
522
523template <typename SourceVariant>
524void RenderEngineTest::fillRedOffsetBuffer() {
525 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800526 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700527 settings.physicalDisplay = offsetRect();
528 settings.clip = offsetRectAtZero();
529
Vishnu Nair9b079a22020-01-21 14:36:08 -0800530 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700531
532 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800533 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700534 layer.geometry.boundaries = offsetRectAtZero().toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800535 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700536 layer.alpha = 1.0f;
537
Vishnu Nair9b079a22020-01-21 14:36:08 -0800538 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700539 invokeDraw(settings, layers, mBuffer);
540}
541
542template <typename SourceVariant>
543void RenderEngineTest::fillBufferPhysicalOffset() {
544 fillRedOffsetBuffer<SourceVariant>();
545
546 expectBufferColor(Rect(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_WIDTH,
547 DEFAULT_DISPLAY_HEIGHT),
548 255, 0, 0, 255);
549 Rect offsetRegionLeft(DEFAULT_DISPLAY_OFFSET, DEFAULT_DISPLAY_HEIGHT);
550 Rect offsetRegionTop(DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_OFFSET);
551
552 expectBufferColor(offsetRegionLeft, 0, 0, 0, 0);
553 expectBufferColor(offsetRegionTop, 0, 0, 0, 0);
554}
555
556template <typename SourceVariant>
Alec Mouri5a6d8572020-03-23 23:56:15 -0700557void RenderEngineTest::fillBufferCheckers(uint32_t orientationFlag) {
Alec Mouri1089aed2018-10-25 21:33:57 -0700558 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800559 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700560 settings.physicalDisplay = fullscreenRect();
561 // Here logical space is 2x2
562 settings.clip = Rect(2, 2);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700563 settings.orientation = orientationFlag;
Alec Mouri1089aed2018-10-25 21:33:57 -0700564
Vishnu Nair9b079a22020-01-21 14:36:08 -0800565 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700566
567 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800568 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700569 Rect rectOne(0, 0, 1, 1);
570 layerOne.geometry.boundaries = rectOne.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800571 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700572 layerOne.alpha = 1.0f;
573
574 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800575 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700576 Rect rectTwo(0, 1, 1, 2);
577 layerTwo.geometry.boundaries = rectTwo.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800578 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700579 layerTwo.alpha = 1.0f;
580
581 renderengine::LayerSettings layerThree;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800582 layerThree.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700583 Rect rectThree(1, 0, 2, 1);
584 layerThree.geometry.boundaries = rectThree.toFloatRect();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800585 SourceVariant::fillColor(layerThree, 0.0f, 0.0f, 1.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700586 layerThree.alpha = 1.0f;
587
Vishnu Nair9b079a22020-01-21 14:36:08 -0800588 layers.push_back(&layerOne);
589 layers.push_back(&layerTwo);
590 layers.push_back(&layerThree);
Alec Mouri1089aed2018-10-25 21:33:57 -0700591
592 invokeDraw(settings, layers, mBuffer);
593}
594
595template <typename SourceVariant>
596void RenderEngineTest::fillBufferCheckersRotate0() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700597 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_0);
Alec Mouri1089aed2018-10-25 21:33:57 -0700598 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 255, 0, 0,
599 255);
600 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
601 DEFAULT_DISPLAY_HEIGHT / 2),
602 0, 0, 255, 255);
603 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
604 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
605 0, 0, 0, 0);
606 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
607 DEFAULT_DISPLAY_HEIGHT),
608 0, 255, 0, 255);
609}
610
611template <typename SourceVariant>
612void RenderEngineTest::fillBufferCheckersRotate90() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700613 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_90);
Alec Mouri1089aed2018-10-25 21:33:57 -0700614 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 255, 0,
615 255);
616 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
617 DEFAULT_DISPLAY_HEIGHT / 2),
618 255, 0, 0, 255);
619 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
620 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
621 0, 0, 255, 255);
622 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
623 DEFAULT_DISPLAY_HEIGHT),
624 0, 0, 0, 0);
625}
626
627template <typename SourceVariant>
628void RenderEngineTest::fillBufferCheckersRotate180() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700629 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_180);
Alec Mouri1089aed2018-10-25 21:33:57 -0700630 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0,
631 0);
632 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
633 DEFAULT_DISPLAY_HEIGHT / 2),
634 0, 255, 0, 255);
635 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
636 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
637 255, 0, 0, 255);
638 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
639 DEFAULT_DISPLAY_HEIGHT),
640 0, 0, 255, 255);
641}
642
643template <typename SourceVariant>
644void RenderEngineTest::fillBufferCheckersRotate270() {
Alec Mouri5a6d8572020-03-23 23:56:15 -0700645 fillBufferCheckers<SourceVariant>(ui::Transform::ROT_270);
Alec Mouri1089aed2018-10-25 21:33:57 -0700646 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 255,
647 255);
648 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
649 DEFAULT_DISPLAY_HEIGHT / 2),
650 0, 0, 0, 0);
651 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
652 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
653 0, 255, 0, 255);
654 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT / 2, DEFAULT_DISPLAY_WIDTH / 2,
655 DEFAULT_DISPLAY_HEIGHT),
656 255, 0, 0, 255);
657}
658
659template <typename SourceVariant>
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800660void RenderEngineTest::fillBufferWithLayerTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700661 renderengine::DisplaySettings settings;
662 settings.physicalDisplay = fullscreenRect();
663 // Here logical space is 2x2
664 settings.clip = Rect(2, 2);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800665 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700666
Vishnu Nair9b079a22020-01-21 14:36:08 -0800667 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700668
669 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800670 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700671 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
672 // Translate one pixel diagonally
673 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 -0800674 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700675 layer.source.solidColor = half3(1.0f, 0.0f, 0.0f);
676 layer.alpha = 1.0f;
677
Vishnu Nair9b079a22020-01-21 14:36:08 -0800678 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700679
680 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800681}
Alec Mouri1089aed2018-10-25 21:33:57 -0700682
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800683template <typename SourceVariant>
684void RenderEngineTest::fillBufferLayerTransform() {
685 fillBufferWithLayerTransform<SourceVariant>();
Alec Mouri1089aed2018-10-25 21:33:57 -0700686 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT / 2), 0, 0, 0, 0);
687 expectBufferColor(Rect(0, 0, DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
688 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT / 2,
689 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
690 255, 0, 0, 255);
691}
692
693template <typename SourceVariant>
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800694void RenderEngineTest::fillBufferWithColorTransform() {
Alec Mouri1089aed2018-10-25 21:33:57 -0700695 renderengine::DisplaySettings settings;
696 settings.physicalDisplay = fullscreenRect();
697 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800698 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700699
Vishnu Nair9b079a22020-01-21 14:36:08 -0800700 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri1089aed2018-10-25 21:33:57 -0700701
702 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800703 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri1089aed2018-10-25 21:33:57 -0700704 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800705 SourceVariant::fillColor(layer, 0.5f, 0.25f, 0.125f, this);
Alec Mouri1089aed2018-10-25 21:33:57 -0700706 layer.alpha = 1.0f;
707
708 // construct a fake color matrix
709 // annihilate green and blue channels
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800710 settings.colorTransform = mat4::scale(vec4(0.9f, 0, 0, 1));
Alec Mouri1089aed2018-10-25 21:33:57 -0700711 // set red channel to red + green
712 layer.colorTransform = mat4(1, 0, 0, 0, 1, 1, 0, 0, 0, 0, 1, 0, 0, 0, 0, 1);
713
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800714 layer.alpha = 1.0f;
715 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
716
Vishnu Nair9b079a22020-01-21 14:36:08 -0800717 layers.push_back(&layer);
Alec Mouri1089aed2018-10-25 21:33:57 -0700718
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800719 invokeDraw(settings, layers, mBuffer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800720}
Alec Mouri1089aed2018-10-25 21:33:57 -0700721
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800722template <typename SourceVariant>
723void RenderEngineTest::fillBufferColorTransform() {
724 fillBufferWithColorTransform<SourceVariant>();
KaiChieh Chuang436fc192020-09-07 13:48:42 +0800725 expectBufferColor(fullscreenRect(), 172, 0, 0, 255, 1);
726}
727
728template <typename SourceVariant>
Alec Mouri7c94edb2018-12-03 21:23:26 -0800729void RenderEngineTest::fillRedBufferWithRoundedCorners() {
730 renderengine::DisplaySettings settings;
731 settings.physicalDisplay = fullscreenRect();
732 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800733 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800734
Vishnu Nair9b079a22020-01-21 14:36:08 -0800735 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800736
737 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800738 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri7c94edb2018-12-03 21:23:26 -0800739 layer.geometry.boundaries = fullscreenRect().toFloatRect();
740 layer.geometry.roundedCornersRadius = 5.0f;
741 layer.geometry.roundedCornersCrop = fullscreenRect().toFloatRect();
742 SourceVariant::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
743 layer.alpha = 1.0f;
744
Vishnu Nair9b079a22020-01-21 14:36:08 -0800745 layers.push_back(&layer);
Alec Mouri7c94edb2018-12-03 21:23:26 -0800746
747 invokeDraw(settings, layers, mBuffer);
748}
749
750template <typename SourceVariant>
751void RenderEngineTest::fillBufferWithRoundedCorners() {
752 fillRedBufferWithRoundedCorners<SourceVariant>();
753 // Corners should be ignored...
754 expectBufferColor(Rect(0, 0, 1, 1), 0, 0, 0, 0);
755 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, 0, DEFAULT_DISPLAY_WIDTH, 1), 0, 0, 0, 0);
756 expectBufferColor(Rect(0, DEFAULT_DISPLAY_HEIGHT - 1, 1, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 0);
757 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH - 1, DEFAULT_DISPLAY_HEIGHT - 1,
758 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
759 0, 0, 0, 0);
760 // ...And the non-rounded portion should be red.
761 // Other pixels may be anti-aliased, so let's not check those.
762 expectBufferColor(Rect(5, 5, DEFAULT_DISPLAY_WIDTH - 5, DEFAULT_DISPLAY_HEIGHT - 5), 255, 0, 0,
763 255);
764}
765
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000766template <typename SourceVariant>
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800767void RenderEngineTest::fillBufferAndBlurBackground() {
768 char value[PROPERTY_VALUE_MAX];
769 property_get("ro.surface_flinger.supports_background_blur", value, "0");
770 if (!atoi(value)) {
771 // This device doesn't support blurs, no-op.
772 return;
773 }
774
775 auto blurRadius = 50;
776 auto center = DEFAULT_DISPLAY_WIDTH / 2;
777
778 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800779 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800780 settings.physicalDisplay = fullscreenRect();
781 settings.clip = fullscreenRect();
782
Vishnu Nair9b079a22020-01-21 14:36:08 -0800783 std::vector<const renderengine::LayerSettings*> layers;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800784
785 renderengine::LayerSettings backgroundLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800786 backgroundLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800787 backgroundLayer.geometry.boundaries = fullscreenRect().toFloatRect();
788 SourceVariant::fillColor(backgroundLayer, 0.0f, 1.0f, 0.0f, this);
789 backgroundLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800790 layers.push_back(&backgroundLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800791
792 renderengine::LayerSettings leftLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800793 leftLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800794 leftLayer.geometry.boundaries =
795 Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT).toFloatRect();
796 SourceVariant::fillColor(leftLayer, 1.0f, 0.0f, 0.0f, this);
797 leftLayer.alpha = 1.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800798 layers.push_back(&leftLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800799
800 renderengine::LayerSettings blurLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800801 blurLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800802 blurLayer.geometry.boundaries = fullscreenRect().toFloatRect();
803 blurLayer.backgroundBlurRadius = blurRadius;
804 blurLayer.alpha = 0;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800805 layers.push_back(&blurLayer);
Lucas Dupin19c8f0e2019-11-25 17:55:44 -0800806
807 invokeDraw(settings, layers, mBuffer);
808
809 expectBufferColor(Rect(center - 1, center - 5, center, center + 5), 150, 150, 0, 255,
810 50 /* tolerance */);
811 expectBufferColor(Rect(center, center - 5, center + 1, center + 5), 150, 150, 0, 255,
812 50 /* tolerance */);
813}
814
815template <typename SourceVariant>
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000816void RenderEngineTest::overlayCorners() {
817 renderengine::DisplaySettings settings;
818 settings.physicalDisplay = fullscreenRect();
819 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800820 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000821
Vishnu Nair9b079a22020-01-21 14:36:08 -0800822 std::vector<const renderengine::LayerSettings*> layersFirst;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000823
824 renderengine::LayerSettings layerOne;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800825 layerOne.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000826 layerOne.geometry.boundaries =
827 FloatRect(0, 0, DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0);
828 SourceVariant::fillColor(layerOne, 1.0f, 0.0f, 0.0f, this);
829 layerOne.alpha = 0.2;
830
Vishnu Nair9b079a22020-01-21 14:36:08 -0800831 layersFirst.push_back(&layerOne);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000832 invokeDraw(settings, layersFirst, mBuffer);
833 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 51, 0, 0, 51);
834 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
835 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
836 0, 0, 0, 0);
837
Vishnu Nair9b079a22020-01-21 14:36:08 -0800838 std::vector<const renderengine::LayerSettings*> layersSecond;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000839 renderengine::LayerSettings layerTwo;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800840 layerTwo.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000841 layerTwo.geometry.boundaries =
842 FloatRect(DEFAULT_DISPLAY_WIDTH / 3.0, DEFAULT_DISPLAY_HEIGHT / 3.0,
843 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT);
844 SourceVariant::fillColor(layerTwo, 0.0f, 1.0f, 0.0f, this);
845 layerTwo.alpha = 1.0f;
846
Vishnu Nair9b079a22020-01-21 14:36:08 -0800847 layersSecond.push_back(&layerTwo);
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000848 invokeDraw(settings, layersSecond, mBuffer);
849
850 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3, DEFAULT_DISPLAY_HEIGHT / 3), 0, 0, 0, 0);
851 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 3 + 1, DEFAULT_DISPLAY_HEIGHT / 3 + 1,
852 DEFAULT_DISPLAY_WIDTH, DEFAULT_DISPLAY_HEIGHT),
853 0, 255, 0, 255);
854}
855
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800856void RenderEngineTest::fillRedBufferTextureTransform() {
857 renderengine::DisplaySettings settings;
858 settings.physicalDisplay = fullscreenRect();
859 settings.clip = Rect(1, 1);
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800860 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800861
Vishnu Nair9b079a22020-01-21 14:36:08 -0800862 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800863
864 renderengine::LayerSettings layer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -0800865 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800866 // Here will allocate a checker board texture, but transform texture
867 // coordinates so that only the upper left is applied.
868 sp<GraphicBuffer> buf = allocateSourceBuffer(2, 2);
869 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800870 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800871 this->mTexNames.push_back(texName);
872
873 uint8_t* pixels;
874 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
875 reinterpret_cast<void**>(&pixels));
876 // Red top left, Green top right, Blue bottom left, Black bottom right
877 pixels[0] = 255;
878 pixels[1] = 0;
879 pixels[2] = 0;
880 pixels[3] = 255;
881 pixels[4] = 0;
882 pixels[5] = 255;
883 pixels[6] = 0;
884 pixels[7] = 255;
885 pixels[8] = 0;
886 pixels[9] = 0;
887 pixels[10] = 255;
888 pixels[11] = 255;
889 buf->unlock();
890
891 layer.source.buffer.buffer = buf;
892 layer.source.buffer.textureName = texName;
893 // Transform coordinates to only be inside the red quadrant.
894 layer.source.buffer.textureTransform = mat4::scale(vec4(0.2, 0.2, 1, 1));
895 layer.alpha = 1.0f;
896 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
897
Vishnu Nair9b079a22020-01-21 14:36:08 -0800898 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800899
900 invokeDraw(settings, layers, mBuffer);
901}
902
903void RenderEngineTest::fillBufferTextureTransform() {
904 fillRedBufferTextureTransform();
905 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
906}
907
908void RenderEngineTest::fillRedBufferWithPremultiplyAlpha() {
909 renderengine::DisplaySettings settings;
910 settings.physicalDisplay = fullscreenRect();
911 // Here logical space is 1x1
912 settings.clip = Rect(1, 1);
913
Vishnu Nair9b079a22020-01-21 14:36:08 -0800914 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800915
916 renderengine::LayerSettings layer;
917 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
918 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800919 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800920 this->mTexNames.push_back(texName);
921
922 uint8_t* pixels;
923 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
924 reinterpret_cast<void**>(&pixels));
925 pixels[0] = 255;
926 pixels[1] = 0;
927 pixels[2] = 0;
928 pixels[3] = 255;
929 buf->unlock();
930
931 layer.source.buffer.buffer = buf;
932 layer.source.buffer.textureName = texName;
933 layer.source.buffer.usePremultipliedAlpha = true;
934 layer.alpha = 0.5f;
935 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
936
Vishnu Nair9b079a22020-01-21 14:36:08 -0800937 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800938
939 invokeDraw(settings, layers, mBuffer);
940}
941
942void RenderEngineTest::fillBufferWithPremultiplyAlpha() {
943 fillRedBufferWithPremultiplyAlpha();
944 expectBufferColor(fullscreenRect(), 128, 0, 0, 128);
945}
946
947void RenderEngineTest::fillRedBufferWithoutPremultiplyAlpha() {
948 renderengine::DisplaySettings settings;
949 settings.physicalDisplay = fullscreenRect();
950 // Here logical space is 1x1
951 settings.clip = Rect(1, 1);
952
Vishnu Nair9b079a22020-01-21 14:36:08 -0800953 std::vector<const renderengine::LayerSettings*> layers;
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800954
955 renderengine::LayerSettings layer;
956 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
957 uint32_t texName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -0800958 RenderEngineTest::mRE->genTextures(1, &texName);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800959 this->mTexNames.push_back(texName);
960
961 uint8_t* pixels;
962 buf->lock(GRALLOC_USAGE_SW_READ_OFTEN | GRALLOC_USAGE_SW_WRITE_OFTEN,
963 reinterpret_cast<void**>(&pixels));
964 pixels[0] = 255;
965 pixels[1] = 0;
966 pixels[2] = 0;
967 pixels[3] = 255;
968 buf->unlock();
969
970 layer.source.buffer.buffer = buf;
971 layer.source.buffer.textureName = texName;
972 layer.source.buffer.usePremultipliedAlpha = false;
973 layer.alpha = 0.5f;
974 layer.geometry.boundaries = Rect(1, 1).toFloatRect();
975
Vishnu Nair9b079a22020-01-21 14:36:08 -0800976 layers.push_back(&layer);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800977
978 invokeDraw(settings, layers, mBuffer);
979}
980
981void RenderEngineTest::fillBufferWithoutPremultiplyAlpha() {
982 fillRedBufferWithoutPremultiplyAlpha();
wukui16f3c0bb2020-08-05 20:35:29 +0800983 expectBufferColor(fullscreenRect(), 128, 0, 0, 128, 1);
Alec Mouri0d5e1eb2018-11-10 20:40:12 -0800984}
985
Alec Mouriac335532018-11-12 15:01:33 -0800986void RenderEngineTest::clearLeftRegion() {
987 renderengine::DisplaySettings settings;
988 settings.physicalDisplay = fullscreenRect();
989 // Here logical space is 4x4
990 settings.clip = Rect(4, 4);
Alec Mouri5a6d8572020-03-23 23:56:15 -0700991 settings.clearRegion = Region(Rect(2, 4));
Vishnu Nair9b079a22020-01-21 14:36:08 -0800992 std::vector<const renderengine::LayerSettings*> layers;
Peiyong Lind8460c82020-07-28 16:04:22 -0700993 // fake layer, without bounds should not render anything
Alec Mouriac335532018-11-12 15:01:33 -0800994 renderengine::LayerSettings layer;
Vishnu Nair9b079a22020-01-21 14:36:08 -0800995 layers.push_back(&layer);
Alec Mouriac335532018-11-12 15:01:33 -0800996 invokeDraw(settings, layers, mBuffer);
997}
998
Alec Mourie7d1d4a2019-02-05 01:13:46 +0000999void RenderEngineTest::clearRegion() {
Alec Mouriac335532018-11-12 15:01:33 -08001000 // Reuse mBuffer
1001 clearLeftRegion();
1002 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, DEFAULT_DISPLAY_HEIGHT), 0, 0, 0, 255);
1003 expectBufferColor(Rect(DEFAULT_DISPLAY_WIDTH / 2, 0, DEFAULT_DISPLAY_WIDTH,
1004 DEFAULT_DISPLAY_HEIGHT),
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001005 0, 0, 0, 0);
Alec Mouriac335532018-11-12 15:01:33 -08001006}
1007
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001008template <typename SourceVariant>
1009void RenderEngineTest::drawShadow(const renderengine::LayerSettings& castingLayer,
1010 const renderengine::ShadowSettings& shadow,
1011 const ubyte4& casterColor, const ubyte4& backgroundColor) {
1012 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001013 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001014 settings.physicalDisplay = fullscreenRect();
1015 settings.clip = fullscreenRect();
1016
Vishnu Nair9b079a22020-01-21 14:36:08 -08001017 std::vector<const renderengine::LayerSettings*> layers;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001018
1019 // add background layer
1020 renderengine::LayerSettings bgLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001021 bgLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001022 bgLayer.geometry.boundaries = fullscreenRect().toFloatRect();
1023 ColorSourceVariant::fillColor(bgLayer, backgroundColor.r / 255.0f, backgroundColor.g / 255.0f,
1024 backgroundColor.b / 255.0f, this);
1025 bgLayer.alpha = backgroundColor.a / 255.0f;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001026 layers.push_back(&bgLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001027
1028 // add shadow layer
1029 renderengine::LayerSettings shadowLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001030 shadowLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001031 shadowLayer.geometry.boundaries = castingLayer.geometry.boundaries;
1032 shadowLayer.alpha = castingLayer.alpha;
1033 shadowLayer.shadow = shadow;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001034 layers.push_back(&shadowLayer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001035
1036 // add layer casting the shadow
1037 renderengine::LayerSettings layer = castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001038 layer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001039 SourceVariant::fillColor(layer, casterColor.r / 255.0f, casterColor.g / 255.0f,
1040 casterColor.b / 255.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001041 layers.push_back(&layer);
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001042
1043 invokeDraw(settings, layers, mBuffer);
1044}
1045
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001046INSTANTIATE_TEST_SUITE_P(PerRenderEngineType, RenderEngineTest,
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001047 testing::Values(std::make_shared<GLESRenderEngineFactory>(),
1048 std::make_shared<GLESCMRenderEngineFactory>()));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001049
1050TEST_P(RenderEngineTest, drawLayers_noLayersToDraw) {
1051 const auto& renderEngineFactory = GetParam();
1052 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri1089aed2018-10-25 21:33:57 -07001053 drawEmptyLayers();
1054}
1055
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001056TEST_P(RenderEngineTest, drawLayers_nullOutputBuffer) {
1057 const auto& renderEngineFactory = GetParam();
1058 mRE = renderEngineFactory->createRenderEngine();
1059
Alec Mourid43ccab2019-03-13 12:23:45 -07001060 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001061 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001062 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001063 renderengine::LayerSettings layer;
1064 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1065 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
Vishnu Nair9b079a22020-01-21 14:36:08 -08001066 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001067 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001068 status_t status = mRE->drawLayers(settings, layers, nullptr, true, base::unique_fd(), &fence);
Alec Mourid43ccab2019-03-13 12:23:45 -07001069
1070 ASSERT_EQ(BAD_VALUE, status);
1071}
1072
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001073TEST_P(RenderEngineTest, drawLayers_nullOutputFence) {
1074 const auto& renderEngineFactory = GetParam();
1075 mRE = renderEngineFactory->createRenderEngine();
1076
Alec Mourid43ccab2019-03-13 12:23:45 -07001077 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001078 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001079 settings.physicalDisplay = fullscreenRect();
1080 settings.clip = fullscreenRect();
1081
Vishnu Nair9b079a22020-01-21 14:36:08 -08001082 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001083 renderengine::LayerSettings layer;
1084 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1085 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1086 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001087 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001088
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001089 status_t status = mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), nullptr);
1090 mCurrentBuffer = mBuffer;
Alec Mourid43ccab2019-03-13 12:23:45 -07001091 ASSERT_EQ(NO_ERROR, status);
1092 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1093}
1094
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001095TEST_P(RenderEngineTest, drawLayers_doesNotCacheFramebuffer) {
1096 const auto& renderEngineFactory = GetParam();
1097 mRE = renderEngineFactory->createRenderEngine();
1098
Alec Mourife0d72b2019-03-21 14:05:56 -07001099 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001100 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourife0d72b2019-03-21 14:05:56 -07001101 settings.physicalDisplay = fullscreenRect();
1102 settings.clip = fullscreenRect();
1103
Vishnu Nair9b079a22020-01-21 14:36:08 -08001104 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourife0d72b2019-03-21 14:05:56 -07001105 renderengine::LayerSettings layer;
1106 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1107 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1108 layer.alpha = 1.0;
Vishnu Nair9b079a22020-01-21 14:36:08 -08001109 layers.push_back(&layer);
Alec Mourife0d72b2019-03-21 14:05:56 -07001110
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001111 status_t status = mRE->drawLayers(settings, layers, mBuffer, false, base::unique_fd(), nullptr);
1112 mCurrentBuffer = mBuffer;
Alec Mourife0d72b2019-03-21 14:05:56 -07001113 ASSERT_EQ(NO_ERROR, status);
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001114 ASSERT_FALSE(mRE->isFramebufferImageCachedForTesting(mBuffer->getId()));
Alec Mourife0d72b2019-03-21 14:05:56 -07001115 expectBufferColor(fullscreenRect(), 255, 0, 0, 255);
1116}
1117
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001118TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_colorSource) {
1119 const auto& renderEngineFactory = GetParam();
1120 mRE = renderEngineFactory->createRenderEngine();
1121
Alec Mouri1089aed2018-10-25 21:33:57 -07001122 fillRedBuffer<ColorSourceVariant>();
1123}
1124
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001125TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_colorSource) {
1126 const auto& renderEngineFactory = GetParam();
1127 mRE = renderEngineFactory->createRenderEngine();
1128
Alec Mouri1089aed2018-10-25 21:33:57 -07001129 fillGreenBuffer<ColorSourceVariant>();
1130}
1131
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001132TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_colorSource) {
1133 const auto& renderEngineFactory = GetParam();
1134 mRE = renderEngineFactory->createRenderEngine();
1135
Alec Mouri1089aed2018-10-25 21:33:57 -07001136 fillBlueBuffer<ColorSourceVariant>();
1137}
1138
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001139TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_colorSource) {
1140 const auto& renderEngineFactory = GetParam();
1141 mRE = renderEngineFactory->createRenderEngine();
1142
Alec Mouri1089aed2018-10-25 21:33:57 -07001143 fillRedTransparentBuffer<ColorSourceVariant>();
1144}
1145
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001146TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_colorSource) {
1147 const auto& renderEngineFactory = GetParam();
1148 mRE = renderEngineFactory->createRenderEngine();
1149
Alec Mouri1089aed2018-10-25 21:33:57 -07001150 fillBufferPhysicalOffset<ColorSourceVariant>();
1151}
1152
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001153TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_colorSource) {
1154 const auto& renderEngineFactory = GetParam();
1155 mRE = renderEngineFactory->createRenderEngine();
1156
Alec Mouri1089aed2018-10-25 21:33:57 -07001157 fillBufferCheckersRotate0<ColorSourceVariant>();
1158}
1159
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001160TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_colorSource) {
1161 const auto& renderEngineFactory = GetParam();
1162 mRE = renderEngineFactory->createRenderEngine();
1163
Alec Mouri1089aed2018-10-25 21:33:57 -07001164 fillBufferCheckersRotate90<ColorSourceVariant>();
1165}
1166
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001167TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_colorSource) {
1168 const auto& renderEngineFactory = GetParam();
1169 mRE = renderEngineFactory->createRenderEngine();
1170
Alec Mouri1089aed2018-10-25 21:33:57 -07001171 fillBufferCheckersRotate180<ColorSourceVariant>();
1172}
1173
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001174TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_colorSource) {
1175 const auto& renderEngineFactory = GetParam();
1176 mRE = renderEngineFactory->createRenderEngine();
1177
Alec Mouri1089aed2018-10-25 21:33:57 -07001178 fillBufferCheckersRotate270<ColorSourceVariant>();
1179}
1180
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001181TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_colorSource) {
1182 const auto& renderEngineFactory = GetParam();
1183 mRE = renderEngineFactory->createRenderEngine();
1184
Alec Mouri1089aed2018-10-25 21:33:57 -07001185 fillBufferLayerTransform<ColorSourceVariant>();
1186}
1187
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001188TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_colorSource) {
1189 const auto& renderEngineFactory = GetParam();
1190 mRE = renderEngineFactory->createRenderEngine();
1191
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001192 fillBufferColorTransform<ColorSourceVariant>();
1193}
1194
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001195TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_colorSource) {
1196 const auto& renderEngineFactory = GetParam();
1197 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri6e57f682018-09-29 20:45:08 -07001198
Alec Mouri7c94edb2018-12-03 21:23:26 -08001199 fillBufferWithRoundedCorners<ColorSourceVariant>();
1200}
1201
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001202TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_colorSource) {
1203 const auto& renderEngineFactory = GetParam();
1204 mRE = renderEngineFactory->createRenderEngine();
1205
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001206 fillBufferAndBlurBackground<ColorSourceVariant>();
1207}
1208
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001209TEST_P(RenderEngineTest, drawLayers_overlayCorners_colorSource) {
1210 const auto& renderEngineFactory = GetParam();
1211 mRE = renderEngineFactory->createRenderEngine();
1212
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001213 overlayCorners<ColorSourceVariant>();
1214}
1215
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001216TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_opaqueBufferSource) {
1217 const auto& renderEngineFactory = GetParam();
1218 mRE = renderEngineFactory->createRenderEngine();
1219
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001220 fillRedBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1221}
1222
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001223TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_opaqueBufferSource) {
1224 const auto& renderEngineFactory = GetParam();
1225 mRE = renderEngineFactory->createRenderEngine();
1226
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001227 fillGreenBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1228}
1229
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001230TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_opaqueBufferSource) {
1231 const auto& renderEngineFactory = GetParam();
1232 mRE = renderEngineFactory->createRenderEngine();
1233
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001234 fillBlueBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1235}
1236
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001237TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_opaqueBufferSource) {
1238 const auto& renderEngineFactory = GetParam();
1239 mRE = renderEngineFactory->createRenderEngine();
1240
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001241 fillRedTransparentBuffer<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1242}
1243
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001244TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_opaqueBufferSource) {
1245 const auto& renderEngineFactory = GetParam();
1246 mRE = renderEngineFactory->createRenderEngine();
1247
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001248 fillBufferPhysicalOffset<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1249}
1250
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001251TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_opaqueBufferSource) {
1252 const auto& renderEngineFactory = GetParam();
1253 mRE = renderEngineFactory->createRenderEngine();
1254
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001255 fillBufferCheckersRotate0<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1256}
1257
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001258TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_opaqueBufferSource) {
1259 const auto& renderEngineFactory = GetParam();
1260 mRE = renderEngineFactory->createRenderEngine();
1261
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001262 fillBufferCheckersRotate90<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1263}
1264
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001265TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_opaqueBufferSource) {
1266 const auto& renderEngineFactory = GetParam();
1267 mRE = renderEngineFactory->createRenderEngine();
1268
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001269 fillBufferCheckersRotate180<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1270}
1271
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001272TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_opaqueBufferSource) {
1273 const auto& renderEngineFactory = GetParam();
1274 mRE = renderEngineFactory->createRenderEngine();
1275
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001276 fillBufferCheckersRotate270<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1277}
1278
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001279TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_opaqueBufferSource) {
1280 const auto& renderEngineFactory = GetParam();
1281 mRE = renderEngineFactory->createRenderEngine();
1282
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001283 fillBufferLayerTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1284}
1285
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001286TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_opaqueBufferSource) {
1287 const auto& renderEngineFactory = GetParam();
1288 mRE = renderEngineFactory->createRenderEngine();
1289
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001290 fillBufferColorTransform<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1291}
1292
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001293TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_opaqueBufferSource) {
1294 const auto& renderEngineFactory = GetParam();
1295 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001296
Alec Mouri7c94edb2018-12-03 21:23:26 -08001297 fillBufferWithRoundedCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1298}
1299
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001300TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_opaqueBufferSource) {
1301 const auto& renderEngineFactory = GetParam();
1302 mRE = renderEngineFactory->createRenderEngine();
1303
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001304 fillBufferAndBlurBackground<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1305}
1306
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001307TEST_P(RenderEngineTest, drawLayers_overlayCorners_opaqueBufferSource) {
1308 const auto& renderEngineFactory = GetParam();
1309 mRE = renderEngineFactory->createRenderEngine();
1310
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001311 overlayCorners<BufferSourceVariant<ForceOpaqueBufferVariant>>();
1312}
1313
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001314TEST_P(RenderEngineTest, drawLayers_fillRedBuffer_bufferSource) {
1315 const auto& renderEngineFactory = GetParam();
1316 mRE = renderEngineFactory->createRenderEngine();
1317
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001318 fillRedBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1319}
1320
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001321TEST_P(RenderEngineTest, drawLayers_fillGreenBuffer_bufferSource) {
1322 const auto& renderEngineFactory = GetParam();
1323 mRE = renderEngineFactory->createRenderEngine();
1324
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001325 fillGreenBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1326}
1327
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001328TEST_P(RenderEngineTest, drawLayers_fillBlueBuffer_bufferSource) {
1329 const auto& renderEngineFactory = GetParam();
1330 mRE = renderEngineFactory->createRenderEngine();
1331
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001332 fillBlueBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1333}
1334
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001335TEST_P(RenderEngineTest, drawLayers_fillRedTransparentBuffer_bufferSource) {
1336 const auto& renderEngineFactory = GetParam();
1337 mRE = renderEngineFactory->createRenderEngine();
1338
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001339 fillRedTransparentBuffer<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1340}
1341
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001342TEST_P(RenderEngineTest, drawLayers_fillBufferPhysicalOffset_bufferSource) {
1343 const auto& renderEngineFactory = GetParam();
1344 mRE = renderEngineFactory->createRenderEngine();
1345
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001346 fillBufferPhysicalOffset<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1347}
1348
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001349TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate0_bufferSource) {
1350 const auto& renderEngineFactory = GetParam();
1351 mRE = renderEngineFactory->createRenderEngine();
1352
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001353 fillBufferCheckersRotate0<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1354}
1355
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001356TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate90_bufferSource) {
1357 const auto& renderEngineFactory = GetParam();
1358 mRE = renderEngineFactory->createRenderEngine();
1359
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001360 fillBufferCheckersRotate90<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1361}
1362
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001363TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate180_bufferSource) {
1364 const auto& renderEngineFactory = GetParam();
1365 mRE = renderEngineFactory->createRenderEngine();
1366
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001367 fillBufferCheckersRotate180<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1368}
1369
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001370TEST_P(RenderEngineTest, drawLayers_fillBufferCheckersRotate270_bufferSource) {
1371 const auto& renderEngineFactory = GetParam();
1372 mRE = renderEngineFactory->createRenderEngine();
1373
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001374 fillBufferCheckersRotate270<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1375}
1376
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001377TEST_P(RenderEngineTest, drawLayers_fillBufferLayerTransform_bufferSource) {
1378 const auto& renderEngineFactory = GetParam();
1379 mRE = renderEngineFactory->createRenderEngine();
1380
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001381 fillBufferLayerTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1382}
1383
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001384TEST_P(RenderEngineTest, drawLayers_fillBufferColorTransform_bufferSource) {
1385 const auto& renderEngineFactory = GetParam();
1386 mRE = renderEngineFactory->createRenderEngine();
1387
KaiChieh Chuang436fc192020-09-07 13:48:42 +08001388 fillBufferColorTransform<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1389}
1390
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001391TEST_P(RenderEngineTest, drawLayers_fillBufferRoundedCorners_bufferSource) {
1392 const auto& renderEngineFactory = GetParam();
1393 mRE = renderEngineFactory->createRenderEngine();
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001394
Alec Mouri7c94edb2018-12-03 21:23:26 -08001395 fillBufferWithRoundedCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1396}
1397
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001398TEST_P(RenderEngineTest, drawLayers_fillBufferAndBlurBackground_bufferSource) {
1399 const auto& renderEngineFactory = GetParam();
1400 mRE = renderEngineFactory->createRenderEngine();
1401
Lucas Dupin19c8f0e2019-11-25 17:55:44 -08001402 fillBufferAndBlurBackground<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1403}
1404
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001405TEST_P(RenderEngineTest, drawLayers_overlayCorners_bufferSource) {
1406 const auto& renderEngineFactory = GetParam();
1407 mRE = renderEngineFactory->createRenderEngine();
1408
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001409 overlayCorners<BufferSourceVariant<RelaxOpaqueBufferVariant>>();
1410}
1411
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001412TEST_P(RenderEngineTest, drawLayers_fillBufferTextureTransform) {
1413 const auto& renderEngineFactory = GetParam();
1414 mRE = renderEngineFactory->createRenderEngine();
1415
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001416 fillBufferTextureTransform();
1417}
1418
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001419TEST_P(RenderEngineTest, drawLayers_fillBuffer_premultipliesAlpha) {
1420 const auto& renderEngineFactory = GetParam();
1421 mRE = renderEngineFactory->createRenderEngine();
1422
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001423 fillBufferWithPremultiplyAlpha();
1424}
1425
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001426TEST_P(RenderEngineTest, drawLayers_fillBuffer_withoutPremultiplyingAlpha) {
1427 const auto& renderEngineFactory = GetParam();
1428 mRE = renderEngineFactory->createRenderEngine();
1429
Alec Mouri0d5e1eb2018-11-10 20:40:12 -08001430 fillBufferWithoutPremultiplyAlpha();
1431}
1432
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001433TEST_P(RenderEngineTest, drawLayers_clearRegion) {
1434 const auto& renderEngineFactory = GetParam();
1435 mRE = renderEngineFactory->createRenderEngine();
1436
Alec Mourie7d1d4a2019-02-05 01:13:46 +00001437 clearRegion();
Alec Mouriac335532018-11-12 15:01:33 -08001438}
1439
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001440TEST_P(RenderEngineTest, drawLayers_fillsBufferAndCachesImages) {
1441 const auto& renderEngineFactory = GetParam();
1442 mRE = renderEngineFactory->createRenderEngine();
1443
Alec Mourid43ccab2019-03-13 12:23:45 -07001444 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001445 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mourid43ccab2019-03-13 12:23:45 -07001446 settings.physicalDisplay = fullscreenRect();
1447 settings.clip = fullscreenRect();
1448
Vishnu Nair9b079a22020-01-21 14:36:08 -08001449 std::vector<const renderengine::LayerSettings*> layers;
Alec Mourid43ccab2019-03-13 12:23:45 -07001450
1451 renderengine::LayerSettings layer;
1452 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1453 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1454
Vishnu Nair9b079a22020-01-21 14:36:08 -08001455 layers.push_back(&layer);
Alec Mourid43ccab2019-03-13 12:23:45 -07001456 invokeDraw(settings, layers, mBuffer);
1457 uint64_t bufferId = layer.source.buffer.buffer->getId();
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001458 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001459 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001460 mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001461 std::lock_guard<std::mutex> lock(barrier->mutex);
1462 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1463 [&]() REQUIRES(barrier->mutex) {
1464 return barrier->isOpen;
1465 }));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001466 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mouri16a99402019-07-29 16:37:30 -07001467 EXPECT_EQ(NO_ERROR, barrier->result);
Alec Mourid43ccab2019-03-13 12:23:45 -07001468}
1469
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001470TEST_P(RenderEngineTest, cacheExternalBuffer_withNullBuffer) {
1471 const auto& renderEngineFactory = GetParam();
1472 mRE = renderEngineFactory->createRenderEngine();
1473
Alec Mouri16a99402019-07-29 16:37:30 -07001474 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001475 mRE->cacheExternalTextureBufferForTesting(nullptr);
Alec Mouri16a99402019-07-29 16:37:30 -07001476 std::lock_guard<std::mutex> lock(barrier->mutex);
1477 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1478 [&]() REQUIRES(barrier->mutex) {
1479 return barrier->isOpen;
1480 }));
1481 EXPECT_TRUE(barrier->isOpen);
1482 EXPECT_EQ(BAD_VALUE, barrier->result);
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001483}
1484
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001485TEST_P(RenderEngineTest, cacheExternalBuffer_cachesImages) {
1486 const auto& renderEngineFactory = GetParam();
1487 mRE = renderEngineFactory->createRenderEngine();
1488
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001489 sp<GraphicBuffer> buf = allocateSourceBuffer(1, 1);
1490 uint64_t bufferId = buf->getId();
Alec Mouri16a99402019-07-29 16:37:30 -07001491 std::shared_ptr<renderengine::gl::ImageManager::Barrier> barrier =
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001492 mRE->cacheExternalTextureBufferForTesting(buf);
Alec Mouri16a99402019-07-29 16:37:30 -07001493 {
1494 std::lock_guard<std::mutex> lock(barrier->mutex);
1495 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1496 [&]() REQUIRES(barrier->mutex) {
1497 return barrier->isOpen;
1498 }));
1499 EXPECT_EQ(NO_ERROR, barrier->result);
1500 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001501 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1502 barrier = mRE->unbindExternalTextureBufferForTesting(bufferId);
Alec Mouri16a99402019-07-29 16:37:30 -07001503 {
1504 std::lock_guard<std::mutex> lock(barrier->mutex);
1505 ASSERT_TRUE(barrier->condition.wait_for(barrier->mutex, std::chrono::seconds(5),
1506 [&]() REQUIRES(barrier->mutex) {
1507 return barrier->isOpen;
1508 }));
1509 EXPECT_EQ(NO_ERROR, barrier->result);
1510 }
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001511 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
Alec Mourid7b3a8b2019-03-21 11:44:18 -07001512}
1513
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001514TEST_P(RenderEngineTest, drawLayers_fillShadow_casterLayerMinSize) {
1515 const auto& renderEngineFactory = GetParam();
1516 mRE = renderEngineFactory->createRenderEngine();
1517
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001518 const ubyte4 casterColor(255, 0, 0, 255);
1519 const ubyte4 backgroundColor(255, 255, 255, 255);
1520 const float shadowLength = 5.0f;
1521 Rect casterBounds(1, 1);
1522 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1523 renderengine::LayerSettings castingLayer;
1524 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1525 castingLayer.alpha = 1.0f;
1526 renderengine::ShadowSettings settings =
1527 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1528 false /* casterIsTranslucent */);
1529
1530 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1531 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1532}
1533
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001534TEST_P(RenderEngineTest, drawLayers_fillShadow_casterColorLayer) {
1535 const auto& renderEngineFactory = GetParam();
1536 mRE = renderEngineFactory->createRenderEngine();
1537
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001538 const ubyte4 casterColor(255, 0, 0, 255);
1539 const ubyte4 backgroundColor(255, 255, 255, 255);
1540 const float shadowLength = 5.0f;
1541 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1542 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1543 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001544 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001545 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1546 castingLayer.alpha = 1.0f;
1547 renderengine::ShadowSettings settings =
1548 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1549 false /* casterIsTranslucent */);
1550
1551 drawShadow<ColorSourceVariant>(castingLayer, settings, casterColor, backgroundColor);
1552 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1553}
1554
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001555TEST_P(RenderEngineTest, drawLayers_fillShadow_casterOpaqueBufferLayer) {
1556 const auto& renderEngineFactory = GetParam();
1557 mRE = renderEngineFactory->createRenderEngine();
1558
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001559 const ubyte4 casterColor(255, 0, 0, 255);
1560 const ubyte4 backgroundColor(255, 255, 255, 255);
1561 const float shadowLength = 5.0f;
1562 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1563 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1564 renderengine::LayerSettings castingLayer;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001565 castingLayer.sourceDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001566 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1567 castingLayer.alpha = 1.0f;
1568 renderengine::ShadowSettings settings =
1569 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1570 false /* casterIsTranslucent */);
1571
1572 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1573 backgroundColor);
1574 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1575}
1576
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001577TEST_P(RenderEngineTest, drawLayers_fillShadow_casterWithRoundedCorner) {
1578 const auto& renderEngineFactory = GetParam();
1579 mRE = renderEngineFactory->createRenderEngine();
1580
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001581 const ubyte4 casterColor(255, 0, 0, 255);
1582 const ubyte4 backgroundColor(255, 255, 255, 255);
1583 const float shadowLength = 5.0f;
1584 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1585 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1586 renderengine::LayerSettings castingLayer;
1587 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1588 castingLayer.geometry.roundedCornersRadius = 3.0f;
1589 castingLayer.geometry.roundedCornersCrop = casterBounds.toFloatRect();
1590 castingLayer.alpha = 1.0f;
1591 renderengine::ShadowSettings settings =
1592 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1593 false /* casterIsTranslucent */);
1594
1595 drawShadow<BufferSourceVariant<ForceOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1596 backgroundColor);
1597 expectShadowColor(castingLayer, settings, casterColor, backgroundColor);
1598}
1599
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001600TEST_P(RenderEngineTest, drawLayers_fillShadow_translucentCasterWithAlpha) {
1601 const auto& renderEngineFactory = GetParam();
1602 mRE = renderEngineFactory->createRenderEngine();
1603
Vishnu Nair16efdbf2019-12-10 11:55:42 -08001604 const ubyte4 casterColor(255, 0, 0, 255);
1605 const ubyte4 backgroundColor(255, 255, 255, 255);
1606 const float shadowLength = 5.0f;
1607 Rect casterBounds(DEFAULT_DISPLAY_WIDTH / 3.0f, DEFAULT_DISPLAY_HEIGHT / 3.0f);
1608 casterBounds.offsetBy(shadowLength + 1, shadowLength + 1);
1609 renderengine::LayerSettings castingLayer;
1610 castingLayer.geometry.boundaries = casterBounds.toFloatRect();
1611 castingLayer.alpha = 0.5f;
1612 renderengine::ShadowSettings settings =
1613 getShadowSettings(vec2(casterBounds.left, casterBounds.top), shadowLength,
1614 true /* casterIsTranslucent */);
1615
1616 drawShadow<BufferSourceVariant<RelaxOpaqueBufferVariant>>(castingLayer, settings, casterColor,
1617 backgroundColor);
1618
1619 // verify only the background since the shadow will draw behind the caster
1620 const float shadowInset = settings.length * -1.0f;
1621 const Rect casterWithShadow =
1622 Rect(casterBounds).inset(shadowInset, shadowInset, shadowInset, shadowInset);
1623 const Region backgroundRegion = Region(fullscreenRect()).subtractSelf(casterWithShadow);
1624 expectBufferColor(backgroundRegion, backgroundColor.r, backgroundColor.g, backgroundColor.b,
1625 backgroundColor.a);
1626}
1627
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001628TEST_P(RenderEngineTest, cleanupPostRender_cleansUpOnce) {
1629 const auto& renderEngineFactory = GetParam();
1630 mRE = renderEngineFactory->createRenderEngine();
1631
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001632 renderengine::DisplaySettings settings;
1633 settings.physicalDisplay = fullscreenRect();
1634 settings.clip = fullscreenRect();
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001635 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001636
1637 std::vector<const renderengine::LayerSettings*> layers;
1638 renderengine::LayerSettings layer;
1639 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1640 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1641 layer.alpha = 1.0;
1642 layers.push_back(&layer);
1643
1644 base::unique_fd fenceOne;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001645 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fenceOne);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001646 base::unique_fd fenceTwo;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001647 mRE->drawLayers(settings, layers, mBuffer, true, std::move(fenceOne), &fenceTwo);
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001648
1649 const int fd = fenceTwo.get();
1650 if (fd >= 0) {
1651 sync_wait(fd, -1);
1652 }
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001653 // Only cleanup the first time.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001654 EXPECT_TRUE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001655 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001656 EXPECT_FALSE(mRE->cleanupPostRender(
Alec Mouri368e1582020-08-13 10:14:29 -07001657 renderengine::RenderEngine::CleanupMode::CLEAN_OUTPUT_RESOURCES));
1658}
1659
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001660TEST_P(RenderEngineTest, cleanupPostRender_whenCleaningAll_replacesTextureMemory) {
1661 const auto& renderEngineFactory = GetParam();
1662 mRE = renderEngineFactory->createRenderEngine();
1663
Alec Mouri368e1582020-08-13 10:14:29 -07001664 renderengine::DisplaySettings settings;
Ana Krulecaa2fe7f2020-11-24 15:06:36 -08001665 settings.outputDataspace = ui::Dataspace::V0_SRGB_LINEAR;
Alec Mouri368e1582020-08-13 10:14:29 -07001666 settings.physicalDisplay = fullscreenRect();
1667 settings.clip = fullscreenRect();
1668
1669 std::vector<const renderengine::LayerSettings*> layers;
1670 renderengine::LayerSettings layer;
1671 layer.geometry.boundaries = fullscreenRect().toFloatRect();
1672 BufferSourceVariant<ForceOpaqueBufferVariant>::fillColor(layer, 1.0f, 0.0f, 0.0f, this);
1673 layer.alpha = 1.0;
1674 layers.push_back(&layer);
1675
1676 base::unique_fd fence;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001677 mRE->drawLayers(settings, layers, mBuffer, true, base::unique_fd(), &fence);
Alec Mouri368e1582020-08-13 10:14:29 -07001678
1679 const int fd = fence.get();
1680 if (fd >= 0) {
1681 sync_wait(fd, -1);
1682 }
1683
1684 uint64_t bufferId = layer.source.buffer.buffer->getId();
1685 uint32_t texName = layer.source.buffer.textureName;
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001686 EXPECT_TRUE(mRE->isImageCachedForTesting(bufferId));
1687 EXPECT_EQ(bufferId, mRE->getBufferIdForTextureNameForTesting(texName));
Alec Mouri368e1582020-08-13 10:14:29 -07001688
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001689 EXPECT_TRUE(mRE->cleanupPostRender(renderengine::RenderEngine::CleanupMode::CLEAN_ALL));
Alec Mouri368e1582020-08-13 10:14:29 -07001690
1691 // Now check that our view of memory is good.
Ana Krulec82ba2ec2020-11-21 13:33:20 -08001692 EXPECT_FALSE(mRE->isImageCachedForTesting(bufferId));
1693 EXPECT_EQ(std::nullopt, mRE->getBufferIdForTextureNameForTesting(bufferId));
1694 EXPECT_TRUE(mRE->isTextureNameKnownForTesting(texName));
Lingfeng Yang2e4fef62020-04-24 14:48:43 +00001695}
1696
Alec Mouri6e57f682018-09-29 20:45:08 -07001697} // namespace android
Ady Abrahamb0dbdaa2020-01-06 16:19:42 -08001698
1699// TODO(b/129481165): remove the #pragma below and fix conversion issues
1700#pragma clang diagnostic pop // ignored "-Wconversion"