blob: fe3a16d4bf32ad9e9e379b297da8dbadf7f1fdc9 [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); },
39 renderengine::RenderEngine::RenderEngineType::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) {
53 EXPECT_CALL(*mRenderEngine, primeCache());
Ana Krulec15f7cf32020-05-12 11:57:42 -070054 mThreadedRE->primeCache();
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
60TEST_F(RenderEngineThreadedTest, genTextures) {
61 uint32_t texName;
62 EXPECT_CALL(*mRenderEngine, genTextures(1, &texName));
Ana Krulec15f7cf32020-05-12 11:57:42 -070063 mThreadedRE->genTextures(1, &texName);
Ana Krulec9bc9dc62020-02-26 12:16:40 -080064}
65
66TEST_F(RenderEngineThreadedTest, deleteTextures) {
67 uint32_t texName;
68 EXPECT_CALL(*mRenderEngine, deleteTextures(1, &texName));
Ana Krulec15f7cf32020-05-12 11:57:42 -070069 mThreadedRE->deleteTextures(1, &texName);
Ana Krulec9bc9dc62020-02-26 12:16:40 -080070}
71
Ana Krulec9bc9dc62020-02-26 12:16:40 -080072TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) {
73 size_t size = 20;
74 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070075 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080076 ASSERT_EQ(size, result);
77}
78
79TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) {
80 size_t size = 0;
81 EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size));
Ana Krulec15f7cf32020-05-12 11:57:42 -070082 size_t result = mThreadedRE->getMaxTextureSize();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080083 ASSERT_EQ(size, result);
84}
85
86TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) {
87 size_t dims = 20;
88 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070089 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080090 ASSERT_EQ(dims, result);
91}
92
93TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) {
94 size_t dims = 0;
95 EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims));
Ana Krulec15f7cf32020-05-12 11:57:42 -070096 size_t result = mThreadedRE->getMaxViewportDims();
Ana Krulec9bc9dc62020-02-26 12:16:40 -080097 ASSERT_EQ(dims, result);
98}
99
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800100TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) {
101 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false));
Ana Krulec15f7cf32020-05-12 11:57:42 -0700102 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800103 ASSERT_EQ(false, result);
104}
105
106TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) {
107 EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true));
Ana Krulec15f7cf32020-05-12 11:57:42 -0700108 status_t result = mThreadedRE->supportsProtectedContent();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800109 ASSERT_EQ(true, result);
110}
111
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400112TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) {
113 EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(true));
114 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0);
115 mThreadedRE->cleanupPostRender();
116
117 // call ANY synchronous function to ensure that cleanupPostRender has completed.
118 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800119}
120
Derek Sollenbergerd3f60652021-06-11 15:34:36 -0400121TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) {
122 EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(false));
123 EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return());
124 mThreadedRE->cleanupPostRender();
125
126 // call ANY synchronous function to ensure that cleanupPostRender has completed.
127 mThreadedRE->getContextPriority();
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800128}
129
Derek Sollenbergerb3998372021-02-16 15:16:56 -0500130TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) {
131 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false));
132 status_t result = mThreadedRE->supportsBackgroundBlur();
133 ASSERT_EQ(false, result);
134}
135
136TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) {
137 EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true));
138 status_t result = mThreadedRE->supportsBackgroundBlur();
139 ASSERT_EQ(true, result);
140}
Sally Qi4cabdd02021-08-05 16:45:57 -0700141
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800142TEST_F(RenderEngineThreadedTest, drawLayers) {
143 renderengine::DisplaySettings settings;
Sally Qi59a9f502021-10-12 18:53:23 +0000144 std::vector<renderengine::LayerSettings> layers;
Alec Mouria90a5702021-04-16 16:36:21 +0000145 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800146 renderengine::impl::
Ady Abrahamd11bade2022-08-01 16:18:03 -0700147 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
Vishnu Nairdbbe3852022-01-12 20:22:11 -0800148 renderengine::impl::ExternalTexture::Usage::READABLE |
149 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
Sally Qi59a9f502021-10-12 18:53:23 +0000150
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800151 base::unique_fd bufferFence;
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800152
Patrick Williams8aed5d22022-10-31 22:18:10 +0000153 EXPECT_CALL(*mRenderEngine, useProtectedContext(false));
154 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
155 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
156 const renderengine::DisplaySettings&,
157 const std::vector<renderengine::LayerSettings>&,
158 const std::shared_ptr<renderengine::ExternalTexture>&, const bool,
159 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
160
161 ftl::Future<FenceResult> future =
162 mThreadedRE->drawLayers(settings, layers, buffer, false, std::move(bufferFence));
163 ASSERT_TRUE(future.valid());
164 auto result = future.get();
165 ASSERT_TRUE(result.ok());
166}
167
168TEST_F(RenderEngineThreadedTest, drawLayers_protectedLayer) {
169 renderengine::DisplaySettings settings;
170 auto layerBuffer = sp<GraphicBuffer>::make();
171 layerBuffer->usage |= GRALLOC_USAGE_PROTECTED;
172 renderengine::LayerSettings layer;
173 layer.source.buffer.buffer = std::make_shared<
174 renderengine::impl::ExternalTexture>(std::move(layerBuffer), *mRenderEngine,
175 renderengine::impl::ExternalTexture::Usage::
176 READABLE);
177 std::vector<renderengine::LayerSettings> layers = {std::move(layer)};
178 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
179 renderengine::impl::
180 ExternalTexture>(sp<GraphicBuffer>::make(), *mRenderEngine,
181 renderengine::impl::ExternalTexture::Usage::READABLE |
182 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
183
184 base::unique_fd bufferFence;
185
186 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
187 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
188 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
189 const renderengine::DisplaySettings&,
190 const std::vector<renderengine::LayerSettings>&,
191 const std::shared_ptr<renderengine::ExternalTexture>&, const bool,
192 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
193
194 ftl::Future<FenceResult> future =
195 mThreadedRE->drawLayers(settings, layers, buffer, false, std::move(bufferFence));
196 ASSERT_TRUE(future.valid());
197 auto result = future.get();
198 ASSERT_TRUE(result.ok());
199}
200
201TEST_F(RenderEngineThreadedTest, drawLayers_protectedOutputBuffer) {
202 renderengine::DisplaySettings settings;
203 std::vector<renderengine::LayerSettings> layers;
204 auto graphicBuffer = sp<GraphicBuffer>::make();
205 graphicBuffer->usage |= GRALLOC_USAGE_PROTECTED;
206 std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared<
207 renderengine::impl::
208 ExternalTexture>(std::move(graphicBuffer), *mRenderEngine,
209 renderengine::impl::ExternalTexture::Usage::READABLE |
210 renderengine::impl::ExternalTexture::Usage::WRITEABLE);
211
212 base::unique_fd bufferFence;
213
214 EXPECT_CALL(*mRenderEngine, useProtectedContext(true));
Sally Qi4cabdd02021-08-05 16:45:57 -0700215 EXPECT_CALL(*mRenderEngine, drawLayersInternal)
Patrick Williams2e9748f2022-08-09 22:48:18 +0000216 .WillOnce([&](const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
Sally Qi4cabdd02021-08-05 16:45:57 -0700217 const renderengine::DisplaySettings&,
Sally Qi59a9f502021-10-12 18:53:23 +0000218 const std::vector<renderengine::LayerSettings>&,
Sally Qi4cabdd02021-08-05 16:45:57 -0700219 const std::shared_ptr<renderengine::ExternalTexture>&, const bool,
Patrick Williams2e9748f2022-08-09 22:48:18 +0000220 base::unique_fd&&) { resultPromise->set_value(Fence::NO_FENCE); });
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800221
Patrick Williams2e9748f2022-08-09 22:48:18 +0000222 ftl::Future<FenceResult> future =
Sally Qi4cabdd02021-08-05 16:45:57 -0700223 mThreadedRE->drawLayers(settings, layers, buffer, false, std::move(bufferFence));
Patrick Williams2e9748f2022-08-09 22:48:18 +0000224 ASSERT_TRUE(future.valid());
225 auto result = future.get();
226 ASSERT_TRUE(result.ok());
Ana Krulec9bc9dc62020-02-26 12:16:40 -0800227}
228
229} // namespace android