blob: bdd94023cc7c64e5c803c9601da7ef9da1d9f4e5 [file] [log] [blame]
Ana Krulec9bc9dc62020-02-26 12:16:40 -08001/*
2 * Copyright 2020 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
17#include <cutils/properties.h>
18#include <gmock/gmock.h>
19#include <gtest/gtest.h>
Patrick Williams8aed5d22022-10-31 22:18:10 +000020#include <hardware/gralloc.h>
Vishnu Nairdbbe3852022-01-12 20:22:11 -080021#include <renderengine/impl/ExternalTexture.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080022#include <renderengine/mock/RenderEngine.h>
Patrick Williams8aed5d22022-10-31 22:18:10 +000023#include <ui/PixelFormat.h>
Ana Krulec9bc9dc62020-02-26 12:16:40 -080024#include "../threaded/RenderEngineThreaded.h"
25
26namespace android {
27
Russell Myers3348c742024-04-29 20:22:42 +000028using renderengine::PrimeCacheConfig;
Ana Krulec9bc9dc62020-02-26 12:16:40 -080029using testing::_;
30using testing::Eq;
31using testing::Mock;
32using testing::Return;
33
34struct RenderEngineThreadedTest : public ::testing::Test {
Ana Krulec9bc9dc62020-02-26 12:16:40 -080035 ~RenderEngineThreadedTest() {}
36
Ana Krulec15f7cf32020-05-12 11:57:42 -070037 void SetUp() override {
38 mThreadedRE = renderengine::threaded::RenderEngineThreaded::create(
Leon Scroggins III696bf932024-01-24 15:21:05 -050039 [this]() { return std::unique_ptr<renderengine::RenderEngine>(mRenderEngine); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -080040 }
41
Ana Krulec15f7cf32020-05-12 11:57:42 -070042 std::unique_ptr<renderengine::threaded::RenderEngineThreaded> mThreadedRE;
Ana Krulec9bc9dc62020-02-26 12:16:40 -080043 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
44};
45
Ana Krulec9bc9dc62020-02-26 12:16:40 -080046TEST_F(RenderEngineThreadedTest, dump) {
47 std::string testString = "XYZ";
48 EXPECT_CALL(*mRenderEngine, dump(_));
Ana Krulec15f7cf32020-05-12 11:57:42 -070049 mThreadedRE->dump(testString);
Ana Krulec9bc9dc62020-02-26 12:16:40 -080050}
51
Russell Myers3348c742024-04-29 20:22:42 +000052MATCHER_P(EqConfig, other, "Equality for prime cache config") {
53 return arg.cacheHolePunchLayer == other.cacheHolePunchLayer &&
54 arg.cacheSolidLayers == other.cacheSolidLayers &&
55 arg.cacheSolidDimmedLayers == other.cacheSolidDimmedLayers &&
56 arg.cacheImageLayers == other.cacheImageLayers &&
57 arg.cacheImageDimmedLayers == other.cacheImageDimmedLayers &&
58 arg.cacheClippedLayers == other.cacheClippedLayers &&
59 arg.cacheShadowLayers == other.cacheShadowLayers &&
60 arg.cachePIPImageLayers == other.cachePIPImageLayers &&
61 arg.cacheTransparentImageDimmedLayers == other.cacheTransparentImageDimmedLayers &&
62 arg.cacheClippedDimmedImageLayers == other.cacheClippedDimmedImageLayers &&
63 arg.cacheUltraHDR == other.cacheUltraHDR;
64}
65
Ana Krulec9bc9dc62020-02-26 12:16:40 -080066TEST_F(RenderEngineThreadedTest, primeCache) {
Russell Myers3348c742024-04-29 20:22:42 +000067 PrimeCacheConfig config;
68 config.cacheUltraHDR = false;
69 EXPECT_CALL(*mRenderEngine, primeCache(EqConfig(config)));
70 mThreadedRE->primeCache(config);
Derek Sollenberger4bea01e2021-04-09 13:59:37 -040071 // need to call ANY synchronous function after primeCache to ensure that primeCache has
72 // completed asynchronously before the test completes execution.
73 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080074}
75
Ana Krulec9bc9dc62020-02-26 12:16:40 -080076TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) {
77 size_t size = 20;
78 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070079 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080080 ASSERT_EQ(size, result);
81}
82
83TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) {
84 size_t size = 0;
85 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070086 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080087 ASSERT_EQ(size, result);
88}
89
90TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) {
91 size_t dims = 20;
92 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070093 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080094 ASSERT_EQ(dims, result);
95}
96
97TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) {
98 size_t dims = 0;
99 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -0700100 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800101 ASSERT_EQ(dims, result);
102}
103
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800104TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) {
105 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false));
Ana Krulec15f7cf32020-05-12 11:57:42 -0700106 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800107 ASSERT_EQ(false, result);
108}
109
110TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {
111 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true));
Ana Krulec15f7cf32020-05-12 11:57:42 -0700112 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800113 ASSERT_EQ(true, result);
114}
115
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400116TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400117 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0);
118 mThreadedRE->cleanupPostRender();
119
120 // call ANY synchronous function to ensure that cleanupPostRender has completed.
121 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800122}
123
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400124TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) {
Alex Careja5b7855f2023-09-27 11:11:22 +0000125 renderengine::DisplaySettings settings;
126 std::vector<renderengine::LayerSettings> layers;
127 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
128 renderengine::impl::
129 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
130 renderengine::impl::ExternalTexture::Usage::READABLE |
131 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
132 base::unique_fd bufferFence;
133
134 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
135 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
136 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
137 const renderengine::DisplaySettings&,
138 const std::vector<renderengine::LayerSettings>&,
139 const std::shared_ptr<renderengine::ExternalTexture>&,
140 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400141 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return());
Alex Careja5b7855f2023-09-27 11:11:22 +0000142 ftl::Future<FenceResult> future =
143 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400144 mThreadedRE->cleanupPostRender();
145
146 // call ANY synchronous function to ensure that cleanupPostRender has completed.
147 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800148}
149
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500150TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) {
151 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false));
152 status_t result = mThreadedRE->supportsBackgroundBlur();
153 ASSERT_EQ(false, result);
154}
155
156TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) {
157 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true));
158 status_t result = mThreadedRE->supportsBackgroundBlur();
159 ASSERT_EQ(true, result);
160}
Sally Qi4cabdd02021-08-05 16:45:57 -0700161
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800162TEST_F(RenderEngineThreadedTest, drawLayers) {
163 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000164 std::vector<renderengine::LayerSettings> layers;
Alec Mouria90a5702021-04-16 16:36:21 +0000165 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800166 renderengine::impl::
Ady Abrahamd11bade2022-08-01 16:18:03 -0700167 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800168 renderengine::impl::ExternalTexture::Usage::READABLE |
169 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
Sally Qi59a9f502021-10-12 18:53:23 +0000170
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800171 base::unique_fd bufferFence;
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800172
Patrick Williams8aed5d22022-10-31 22:18:10 +0000173 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
174 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
175 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
176 const renderengine::DisplaySettings&,
177 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000178 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000179 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
180
181 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000182 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000183 ASSERT_TRUE(future.valid());
184 auto result = future.get();
185 ASSERT_TRUE(result.ok());
186}
187
188TEST_F(RenderEngineThreadedTest, drawLayers_protectedLayer) {
189 renderengine::DisplaySettings settings;
190 auto layerBuffer = sp<GraphicBuffer>::make();
191 layerBuffer->usage |= GRALLOC_USAGE_PROTECTED;
192 renderengine::LayerSettings layer;
193 layer.source.buffer.buffer = std::make_shared<
194 renderengine::impl::ExternalTexture>(std::move(layerBuffer), *mRenderEngine,
195 renderengine::impl::ExternalTexture::Usage::
196 READABLE);
197 std::vector<renderengine::LayerSettings> layers = {std::move(layer)};
198 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
199 renderengine::impl::
200 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
201 renderengine::impl::ExternalTexture::Usage::READABLE |
202 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
203
204 base::unique_fd bufferFence;
205
206 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
207 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
208 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
209 const renderengine::DisplaySettings&,
210 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000211 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000212 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
213
214 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000215 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000216 ASSERT_TRUE(future.valid());
217 auto result = future.get();
218 ASSERT_TRUE(result.ok());
219}
220
221TEST_F(RenderEngineThreadedTest, drawLayers_protectedOutputBuffer) {
222 renderengine::DisplaySettings settings;
223 std::vector<renderengine::LayerSettings> layers;
224 auto graphicBuffer = sp<GraphicBuffer>::make();
225 graphicBuffer->usage |= GRALLOC_USAGE_PROTECTED;
226 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
227 renderengine::impl::
228 ExternalTexture>(std::move(graphicBuffer), *mRenderEngine,
229 renderengine::impl::ExternalTexture::Usage::READABLE |
230 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
231
232 base::unique_fd bufferFence;
233
234 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
Sally Qi4cabdd02021-08-05 16:45:57 -0700235 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
Patrick Williams2e9748f2022-08-09 22:48:18 +0000236 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
Sally Qi4cabdd02021-08-05 16:45:57 -0700237 const renderengine::DisplaySettings&,
Sally Qi59a9f502021-10-12 18:53:23 +0000238 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000239 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams2e9748f2022-08-09 22:48:18 +0000240 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800241
Patrick Williams2e9748f2022-08-09 22:48:18 +0000242 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000243 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams2e9748f2022-08-09 22:48:18 +0000244 ASSERT_TRUE(future.valid());
245 auto result = future.get();
246 ASSERT_TRUE(result.ok());
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800247}
248
249} // namespace android