| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 1 | /* | 
|  | 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> | 
|  | 20 | #include <renderengine/mock/RenderEngine.h> | 
|  | 21 | #include "../threaded/RenderEngineThreaded.h" | 
|  | 22 |  | 
|  | 23 | namespace android { | 
|  | 24 |  | 
|  | 25 | using testing::_; | 
|  | 26 | using testing::Eq; | 
|  | 27 | using testing::Mock; | 
|  | 28 | using testing::Return; | 
|  | 29 |  | 
|  | 30 | struct RenderEngineThreadedTest : public ::testing::Test { | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 31 | ~RenderEngineThreadedTest() {} | 
|  | 32 |  | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 33 | void SetUp() override { | 
|  | 34 | mThreadedRE = renderengine::threaded::RenderEngineThreaded::create( | 
| Alec Mouri | 0d99510 | 2021-02-24 16:53:38 -0800 | [diff] [blame] | 35 | [this]() { return std::unique_ptr<renderengine::RenderEngine>(mRenderEngine); }, | 
|  | 36 | renderengine::RenderEngine::RenderEngineType::THREADED); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 37 | } | 
|  | 38 |  | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 39 | std::unique_ptr<renderengine::threaded::RenderEngineThreaded> mThreadedRE; | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 40 | renderengine::mock::RenderEngine* mRenderEngine = new renderengine::mock::RenderEngine(); | 
|  | 41 | }; | 
|  | 42 |  | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 43 | TEST_F(RenderEngineThreadedTest, dump) { | 
|  | 44 | std::string testString = "XYZ"; | 
|  | 45 | EXPECT_CALL(*mRenderEngine, dump(_)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 46 | mThreadedRE->dump(testString); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 47 | } | 
|  | 48 |  | 
|  | 49 | TEST_F(RenderEngineThreadedTest, primeCache) { | 
|  | 50 | EXPECT_CALL(*mRenderEngine, primeCache()); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 51 | mThreadedRE->primeCache(); | 
| Derek Sollenberger | 4bea01e | 2021-04-09 13:59:37 -0400 | [diff] [blame] | 52 | // need to call ANY synchronous function after primeCache to ensure that primeCache has | 
|  | 53 | // completed asynchronously before the test completes execution. | 
|  | 54 | mThreadedRE->getContextPriority(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 55 | } | 
|  | 56 |  | 
|  | 57 | TEST_F(RenderEngineThreadedTest, genTextures) { | 
|  | 58 | uint32_t texName; | 
|  | 59 | EXPECT_CALL(*mRenderEngine, genTextures(1, &texName)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 60 | mThreadedRE->genTextures(1, &texName); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 61 | } | 
|  | 62 |  | 
|  | 63 | TEST_F(RenderEngineThreadedTest, deleteTextures) { | 
|  | 64 | uint32_t texName; | 
|  | 65 | EXPECT_CALL(*mRenderEngine, deleteTextures(1, &texName)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 66 | mThreadedRE->deleteTextures(1, &texName); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 67 | } | 
|  | 68 |  | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 69 | TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns20) { | 
|  | 70 | size_t size = 20; | 
|  | 71 | EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 72 | size_t result = mThreadedRE->getMaxTextureSize(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 73 | ASSERT_EQ(size, result); | 
|  | 74 | } | 
|  | 75 |  | 
|  | 76 | TEST_F(RenderEngineThreadedTest, getMaxTextureSize_returns0) { | 
|  | 77 | size_t size = 0; | 
|  | 78 | EXPECT_CALL(*mRenderEngine, getMaxTextureSize()).WillOnce(Return(size)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 79 | size_t result = mThreadedRE->getMaxTextureSize(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 80 | ASSERT_EQ(size, result); | 
|  | 81 | } | 
|  | 82 |  | 
|  | 83 | TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns20) { | 
|  | 84 | size_t dims = 20; | 
|  | 85 | EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 86 | size_t result = mThreadedRE->getMaxViewportDims(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 87 | ASSERT_EQ(dims, result); | 
|  | 88 | } | 
|  | 89 |  | 
|  | 90 | TEST_F(RenderEngineThreadedTest, getMaxViewportDims_returns0) { | 
|  | 91 | size_t dims = 0; | 
|  | 92 | EXPECT_CALL(*mRenderEngine, getMaxViewportDims()).WillOnce(Return(dims)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 93 | size_t result = mThreadedRE->getMaxViewportDims(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 94 | ASSERT_EQ(dims, result); | 
|  | 95 | } | 
|  | 96 |  | 
|  | 97 | TEST_F(RenderEngineThreadedTest, isProtected_returnsFalse) { | 
|  | 98 | EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(false)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 99 | status_t result = mThreadedRE->isProtected(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 100 | ASSERT_EQ(false, result); | 
|  | 101 | } | 
|  | 102 |  | 
|  | 103 | TEST_F(RenderEngineThreadedTest, isProtected_returnsTrue) { | 
|  | 104 | EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(true)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 105 | size_t result = mThreadedRE->isProtected(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 106 | ASSERT_EQ(true, result); | 
|  | 107 | } | 
|  | 108 |  | 
|  | 109 | TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsFalse) { | 
|  | 110 | EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(false)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 111 | status_t result = mThreadedRE->supportsProtectedContent(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 112 | ASSERT_EQ(false, result); | 
|  | 113 | } | 
|  | 114 |  | 
|  | 115 | TEST_F(RenderEngineThreadedTest, supportsProtectedContent_returnsTrue) { | 
|  | 116 | EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true)); | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 117 | status_t result = mThreadedRE->supportsProtectedContent(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 118 | ASSERT_EQ(true, result); | 
|  | 119 | } | 
|  | 120 |  | 
| Derek Sollenberger | 1ec2fb5 | 2021-06-16 15:11:27 -0400 | [diff] [blame] | 121 | TEST_F(RenderEngineThreadedTest, useProtectedContext) { | 
|  | 122 | EXPECT_CALL(*mRenderEngine, useProtectedContext(true)); | 
|  | 123 | auto& ipExpect = EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(false)); | 
|  | 124 | EXPECT_CALL(*mRenderEngine, supportsProtectedContent()).WillOnce(Return(true)); | 
|  | 125 | EXPECT_CALL(*mRenderEngine, isProtected()).After(ipExpect).WillOnce(Return(true)); | 
|  | 126 |  | 
|  | 127 | mThreadedRE->useProtectedContext(true); | 
|  | 128 | ASSERT_EQ(true, mThreadedRE->isProtected()); | 
|  | 129 |  | 
|  | 130 | // call ANY synchronous function to ensure that useProtectedContext has completed. | 
|  | 131 | mThreadedRE->getContextPriority(); | 
|  | 132 | ASSERT_EQ(true, mThreadedRE->isProtected()); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 133 | } | 
|  | 134 |  | 
| Derek Sollenberger | 1ec2fb5 | 2021-06-16 15:11:27 -0400 | [diff] [blame] | 135 | TEST_F(RenderEngineThreadedTest, useProtectedContext_quickReject) { | 
|  | 136 | EXPECT_CALL(*mRenderEngine, useProtectedContext(false)).Times(0); | 
|  | 137 | EXPECT_CALL(*mRenderEngine, isProtected()).WillOnce(Return(false)); | 
|  | 138 | mThreadedRE->useProtectedContext(false); | 
|  | 139 | // call ANY synchronous function to ensure that useProtectedContext has completed. | 
|  | 140 | mThreadedRE->getContextPriority(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 141 | } | 
|  | 142 |  | 
| Derek Sollenberger | d3f6065 | 2021-06-11 15:34:36 -0400 | [diff] [blame] | 143 | TEST_F(RenderEngineThreadedTest, PostRenderCleanup_skipped) { | 
|  | 144 | EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(true)); | 
|  | 145 | EXPECT_CALL(*mRenderEngine, cleanupPostRender()).Times(0); | 
|  | 146 | mThreadedRE->cleanupPostRender(); | 
|  | 147 |  | 
|  | 148 | // call ANY synchronous function to ensure that cleanupPostRender has completed. | 
|  | 149 | mThreadedRE->getContextPriority(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 150 | } | 
|  | 151 |  | 
| Derek Sollenberger | d3f6065 | 2021-06-11 15:34:36 -0400 | [diff] [blame] | 152 | TEST_F(RenderEngineThreadedTest, PostRenderCleanup_notSkipped) { | 
|  | 153 | EXPECT_CALL(*mRenderEngine, canSkipPostRenderCleanup()).WillOnce(Return(false)); | 
|  | 154 | EXPECT_CALL(*mRenderEngine, cleanupPostRender()).WillOnce(Return()); | 
|  | 155 | mThreadedRE->cleanupPostRender(); | 
|  | 156 |  | 
|  | 157 | // call ANY synchronous function to ensure that cleanupPostRender has completed. | 
|  | 158 | mThreadedRE->getContextPriority(); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 159 | } | 
|  | 160 |  | 
| Derek Sollenberger | b399837 | 2021-02-16 15:16:56 -0500 | [diff] [blame] | 161 | TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsFalse) { | 
|  | 162 | EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(false)); | 
|  | 163 | status_t result = mThreadedRE->supportsBackgroundBlur(); | 
|  | 164 | ASSERT_EQ(false, result); | 
|  | 165 | } | 
|  | 166 |  | 
|  | 167 | TEST_F(RenderEngineThreadedTest, supportsBackgroundBlur_returnsTrue) { | 
|  | 168 | EXPECT_CALL(*mRenderEngine, supportsBackgroundBlur()).WillOnce(Return(true)); | 
|  | 169 | status_t result = mThreadedRE->supportsBackgroundBlur(); | 
|  | 170 | ASSERT_EQ(true, result); | 
|  | 171 | } | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 172 | TEST_F(RenderEngineThreadedTest, drawLayers) { | 
|  | 173 | renderengine::DisplaySettings settings; | 
|  | 174 | std::vector<const renderengine::LayerSettings*> layers; | 
| Alec Mouri | a90a570 | 2021-04-16 16:36:21 +0000 | [diff] [blame] | 175 | std::shared_ptr<renderengine::ExternalTexture> buffer = std::make_shared< | 
|  | 176 | renderengine::ExternalTexture>(new GraphicBuffer(), *mRenderEngine, | 
|  | 177 | renderengine::ExternalTexture::Usage::READABLE | | 
|  | 178 | renderengine::ExternalTexture::Usage::WRITEABLE); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 179 | base::unique_fd bufferFence; | 
|  | 180 | base::unique_fd drawFence; | 
|  | 181 |  | 
|  | 182 | EXPECT_CALL(*mRenderEngine, drawLayers) | 
|  | 183 | .WillOnce([](const renderengine::DisplaySettings&, | 
|  | 184 | const std::vector<const renderengine::LayerSettings*>&, | 
| Alec Mouri | a90a570 | 2021-04-16 16:36:21 +0000 | [diff] [blame] | 185 | const std::shared_ptr<renderengine::ExternalTexture>&, const bool, | 
|  | 186 | base::unique_fd&&, base::unique_fd*) -> status_t { return NO_ERROR; }); | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 187 |  | 
| Ana Krulec | 15f7cf3 | 2020-05-12 11:57:42 -0700 | [diff] [blame] | 188 | status_t result = mThreadedRE->drawLayers(settings, layers, buffer, false, | 
| Ana Krulec | 9bc9dc6 | 2020-02-26 12:16:40 -0800 | [diff] [blame] | 189 | std::move(bufferFence), &drawFence); | 
|  | 190 | ASSERT_EQ(NO_ERROR, result); | 
|  | 191 | } | 
|  | 192 |  | 
|  | 193 | } // namespace android |