blob: 1b9adba063a613d6feeaeb1fbdcd8dea50302d83 [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(
Alec Mouri0d995102021-02-24 16:53:38 -080038 [this]() { return std::unique_ptr<renderengine::RenderEngine>(mRenderEngine); },
Alec Mourie2b61c62023-08-15 19:04:54 +000039 renderengine::RenderEngine::RenderEngineType::SKIA_GL_THREADED);
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
52TEST_F(RenderEngineThreadedTest, primeCache) {
Bruno BELANYIb9b5b702023-10-13 13:25:11 +000053 EXPECT_CALL(*mRenderEngine, primeCache(false));
54 mThreadedRE->primeCache(false);
Derek Sollenberger4bea01e2021-04-09 13:59:37 -040055 // need to call ANY synchronous function after primeCache to ensure that primeCache has
56 // completed asynchronously before the test completes execution.
57 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080058}
59
Ana Krulec9bc9dc62020-02-26 12:16:40 -080060TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) {
61 size_t size = 20;
62 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070063 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080064 ASSERT_EQ(size, result);
65}
66
67TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) {
68 size_t size = 0;
69 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070070 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080071 ASSERT_EQ(size, result);
72}
73
74TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) {
75 size_t dims = 20;
76 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070077 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080078 ASSERT_EQ(dims, result);
79}
80
81TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) {
82 size_t dims = 0;
83 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070084 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080085 ASSERT_EQ(dims, result);
86}
87
Ana Krulec9bc9dc62020-02-26 12:16:40 -080088TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) {
89 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false));
Ana Krulec15f7cf32020-05-12 11:57:42 -070090 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080091 ASSERT_EQ(false, result);
92}
93
94TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {
95 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true));
Ana Krulec15f7cf32020-05-12 11:57:42 -070096 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080097 ASSERT_EQ(true, result);
98}
99
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400100TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) {
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400101 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0);
102 mThreadedRE->cleanupPostRender();
103
104 // call ANY synchronous function to ensure that cleanupPostRender has completed.
105 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800106}
107
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400108TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) {
Alex Careja5b7855f2023-09-27 11:11:22 +0000109 renderengine::DisplaySettings settings;
110 std::vector<renderengine::LayerSettings> layers;
111 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
112 renderengine::impl::
113 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
114 renderengine::impl::ExternalTexture::Usage::READABLE |
115 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
116 base::unique_fd bufferFence;
117
118 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
119 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
120 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
121 const renderengine::DisplaySettings&,
122 const std::vector<renderengine::LayerSettings>&,
123 const std::shared_ptr<renderengine::ExternalTexture>&,
124 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400125 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return());
Alex Careja5b7855f2023-09-27 11:11:22 +0000126 ftl::Future<FenceResult> future =
127 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400128 mThreadedRE->cleanupPostRender();
129
130 // call ANY synchronous function to ensure that cleanupPostRender has completed.
131 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800132}
133
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500134TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) {
135 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false));
136 status_t result = mThreadedRE->supportsBackgroundBlur();
137 ASSERT_EQ(false, result);
138}
139
140TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) {
141 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true));
142 status_t result = mThreadedRE->supportsBackgroundBlur();
143 ASSERT_EQ(true, result);
144}
Sally Qi4cabdd02021-08-05 16:45:57 -0700145
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800146TEST_F(RenderEngineThreadedTest, drawLayers) {
147 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000148 std::vector<renderengine::LayerSettings> layers;
Alec Mouria90a5702021-04-16 16:36:21 +0000149 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800150 renderengine::impl::
Ady Abrahamd11bade2022-08-01 16:18:03 -0700151 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800152 renderengine::impl::ExternalTexture::Usage::READABLE |
153 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
Sally Qi59a9f502021-10-12 18:53:23 +0000154
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800155 base::unique_fd bufferFence;
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800156
Patrick Williams8aed5d22022-10-31 22:18:10 +0000157 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
158 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
159 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
160 const renderengine::DisplaySettings&,
161 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000162 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000163 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
164
165 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000166 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000167 ASSERT_TRUE(future.valid());
168 auto result = future.get();
169 ASSERT_TRUE(result.ok());
170}
171
172TEST_F(RenderEngineThreadedTest, drawLayers_protectedLayer) {
173 renderengine::DisplaySettings settings;
174 auto layerBuffer = sp<GraphicBuffer>::make();
175 layerBuffer->usage |= GRALLOC_USAGE_PROTECTED;
176 renderengine::LayerSettings layer;
177 layer.source.buffer.buffer = std::make_shared<
178 renderengine::impl::ExternalTexture>(std::move(layerBuffer), *mRenderEngine,
179 renderengine::impl::ExternalTexture::Usage::
180 READABLE);
181 std::vector<renderengine::LayerSettings> layers = {std::move(layer)};
182 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
183 renderengine::impl::
184 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
185 renderengine::impl::ExternalTexture::Usage::READABLE |
186 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
187
188 base::unique_fd bufferFence;
189
190 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
191 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
192 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
193 const renderengine::DisplaySettings&,
194 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000195 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams8aed5d22022-10-31 22:18:10 +0000196 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
197
198 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000199 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams8aed5d22022-10-31 22:18:10 +0000200 ASSERT_TRUE(future.valid());
201 auto result = future.get();
202 ASSERT_TRUE(result.ok());
203}
204
205TEST_F(RenderEngineThreadedTest, drawLayers_protectedOutputBuffer) {
206 renderengine::DisplaySettings settings;
207 std::vector<renderengine::LayerSettings> layers;
208 auto graphicBuffer = sp<GraphicBuffer>::make();
209 graphicBuffer->usage |= GRALLOC_USAGE_PROTECTED;
210 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
211 renderengine::impl::
212 ExternalTexture>(std::move(graphicBuffer), *mRenderEngine,
213 renderengine::impl::ExternalTexture::Usage::READABLE |
214 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
215
216 base::unique_fd bufferFence;
217
218 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
Sally Qi4cabdd02021-08-05 16:45:57 -0700219 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
Patrick Williams2e9748f2022-08-09 22:48:18 +0000220 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
Sally Qi4cabdd02021-08-05 16:45:57 -0700221 const renderengine::DisplaySettings&,
Sally Qi59a9f502021-10-12 18:53:23 +0000222 const std::vector<renderengine::LayerSettings>&,
Alec Mourif29700f2023-08-17 21:53:31 +0000223 const std::shared_ptr<renderengine::ExternalTexture>&,
Patrick Williams2e9748f2022-08-09 22:48:18 +0000224 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800225
Patrick Williams2e9748f2022-08-09 22:48:18 +0000226 ftl::Future<FenceResult> future =
Alec Mourif29700f2023-08-17 21:53:31 +0000227 mThreadedRE->drawLayers(settings, layers, buffer, std::move(bufferFence));
Patrick Williams2e9748f2022-08-09 22:48:18 +0000228 ASSERT_TRUE(future.valid());
229 auto result = future.get();
230 ASSERT_TRUE(result.ok());
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800231}
232
233} // namespace android