blob: d56dbb2a7bc35d0c7a8e76f1a2c380cfd7887840 [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
28using testing::_;
29using testing::Eq;
30using testing::Mock;
31using testing::Return;
32
33struct RenderEngineThreadedTest : public ::testing::Test {
Ana Krulec9bc9dc62020-02-26 12:16:40 -080034 ~RenderEngineThreadedTest() {}
35
Ana Krulec15f7cf32020-05-12 11:57:42 -070036 void SetUp() override {
37 mThreadedRE = renderengine::threaded::RenderEngineThreaded::create(
Leon Scroggins III696bf932024-01-24 15:21:05 -050038 [this]() { return std::unique_ptr<renderengine::RenderEngine>(mRenderEngine); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -080039 }
40
Ana Krulec15f7cf32020-05-12 11:57:42 -070041 std::unique_ptr<renderengine::threaded::RenderEngineThreaded> mThreadedRE;
Ana Krulec9bc9dc62020-02-26 12:16:40 -080042 renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine();
43};
44
Ana Krulec9bc9dc62020-02-26 12:16:40 -080045TEST_F(RenderEngineThreadedTest, dump) {
46 std::string testString = "XYZ";
47 EXPECT_CALL(*mRenderEngine, dump(_));
Ana Krulec15f7cf32020-05-12 11:57:42 -070048 mThreadedRE->dump(testString);
Ana Krulec9bc9dc62020-02-26 12:16:40 -080049}
50
51TEST_F(RenderEngineThreadedTest, primeCache) {
Bruno BELANYIb9b5b702023-10-13 13:25:11 +000052 EXPECT_CALL(*mRenderEngine, primeCache(false));
53 mThreadedRE->primeCache(false);
Derek Sollenberger4bea01e2021-04-09 13:59:37 -040054 // need to call ANY synchronous function after primeCache to ensure that primeCache has
55 // completed asynchronously before the test completes execution.
56 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080057}
58
Ana Krulec9bc9dc62020-02-26 12:16:40 -080059TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) {
60 size_t size = 20;
61 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070062 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080063 ASSERT_EQ(size, result);
64}
65
66TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) {
67 size_t size = 0;
68 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070069 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080070 ASSERT_EQ(size, result);
71}
72
73TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) {
74 size_t dims = 20;
75 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070076 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080077 ASSERT_EQ(dims, result);
78}
79
80TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) {
81 size_t dims = 0;
82 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070083 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080084 ASSERT_EQ(dims, result);
85}
86
Ana Krulec9bc9dc62020-02-26 12:16:40 -080087TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) {
88 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false));
Ana Krulec15f7cf32020-05-12 11:57:42 -070089 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080090 ASSERT_EQ(false, result);
91}
92
93TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {
94 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true));
Ana Krulec15f7cf32020-05-12 11:57:42 -070095 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080096 ASSERT_EQ(true, result);
97}
98
Derek Sollenbergerd3f60652021-06-11 15:34:36 -040099TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400100 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0);
101 mThreadedRE->cleanupPostRender();
102
103 // call ANY synchronous function to ensure that cleanupPostRender has completed.
104 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800105}
106
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400107TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) {
Alex Careja5b7855f2023-09-27 11:11:22 +0000108 renderengine::DisplaySettings settings;
109 std::vector<renderengine::LayerSettings> layers;
110 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
111 renderengine::impl::
112 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
113 renderengine::impl::ExternalTexture::Usage::READABLE |
114 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
115 base::unique_fd bufferFence;
116
117 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
118 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
119 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
120 const renderengine::DisplaySettings&,
121 const std::vector<renderengine::LayerSettings>&,
122 const std::shared_ptr<renderengine::ExternalTexture>&,
123 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400124 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return());
Alex Careja5b7855f2023-09-27 11:11:22 +0000125 ftl::Future<FenceResult> future =
126 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400127 mThreadedRE->cleanupPostRender();
128
129 // call ANY synchronous function to ensure that cleanupPostRender has completed.
130 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800131}
132
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500133TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) {
134 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false));
135 status_t result = mThreadedRE->supportsBackgroundBlur();
136 ASSERT_EQ(false, result);
137}
138
139TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) {
140 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true));
141 status_t result = mThreadedRE->supportsBackgroundBlur();
142 ASSERT_EQ(true, result);
143}
Sally Qi4cabdd02021-08-05 16:45:57 -0700144
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800145TEST_F(RenderEngineThreadedTest, drawLayers) {
146 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000147 std::vector<renderengine::LayerSettings> layers;
Alec Mouria90a5702021-04-16 16:36:21 +0000148 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800149 renderengine::impl::
Ady Abrahamd11bade2022-08-01 16:18:03 -0700150 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800151 renderengine::impl::ExternalTexture::Usage::READABLE |
152 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
Sally Qi59a9f502021-10-12 18:53:23 +0000153
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800154 base::unique_fd bufferFence;
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800155
Patrick Williams8aed5d22022-10-31 22:18:10 +0000156 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
157 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
158 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
159 const renderengine::DisplaySettings&,
160 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000161 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000162 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
163
164 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000165 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000166 ASSERT_TRUE(future.valid());
167 auto result = future.get();
168 ASSERT_TRUE(result.ok());
169}
170
171TEST_F(RenderEngineThreadedTest, drawLayers_protectedLayer) {
172 renderengine::DisplaySettings settings;
173 auto layerBuffer = sp<GraphicBuffer>::make();
174 layerBuffer->usage |= GRALLOC_USAGE_PROTECTED;
175 renderengine::LayerSettings layer;
176 layer.source.buffer.buffer = std::make_shared<
177 renderengine::impl::ExternalTexture>(std::move(layerBuffer), *mRenderEngine,
178 renderengine::impl::ExternalTexture::Usage::
179 READABLE);
180 std::vector<renderengine::LayerSettings> layers = {std::move(layer)};
181 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
182 renderengine::impl::
183 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
184 renderengine::impl::ExternalTexture::Usage::READABLE |
185 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
186
187 base::unique_fd bufferFence;
188
189 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
190 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
191 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
192 const renderengine::DisplaySettings&,
193 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000194 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000195 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
196
197 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000198 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000199 ASSERT_TRUE(future.valid());
200 auto result = future.get();
201 ASSERT_TRUE(result.ok());
202}
203
204TEST_F(RenderEngineThreadedTest, drawLayers_protectedOutputBuffer) {
205 renderengine::DisplaySettings settings;
206 std::vector<renderengine::LayerSettings> layers;
207 auto graphicBuffer = sp<GraphicBuffer>::make();
208 graphicBuffer->usage |= GRALLOC_USAGE_PROTECTED;
209 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
210 renderengine::impl::
211 ExternalTexture>(std::move(graphicBuffer), *mRenderEngine,
212 renderengine::impl::ExternalTexture::Usage::READABLE |
213 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
214
215 base::unique_fd bufferFence;
216
217 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
Sally Qi4cabdd02021-08-05 16:45:57 -0700218 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
Patrick Williams2e9748f2022-08-09 22:48:18 +0000219 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
Sally Qi4cabdd02021-08-05 16:45:57 -0700220 const renderengine::DisplaySettings&,
Sally Qi59a9f502021-10-12 18:53:23 +0000221 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000222 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams2e9748f2022-08-09 22:48:18 +0000223 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800224
Patrick Williams2e9748f2022-08-09 22:48:18 +0000225 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000226 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams2e9748f2022-08-09 22:48:18 +0000227 ASSERT_TRUE(future.valid());
228 auto result = future.get();
229 ASSERT_TRUE(result.ok());
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800230}
231
232} // namespace android