xref: /aosp_15_r20/frameworks/native/libs/renderengine/threaded/RenderEngineThreaded.h (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright 2020 The Android Open Source Project
3*38e8c45fSAndroid Build Coastguard Worker  *
4*38e8c45fSAndroid Build Coastguard Worker  * Licensed under the Apache License, Version 2.0 (the "License");
5*38e8c45fSAndroid Build Coastguard Worker  * you may not use this file except in compliance with the License.
6*38e8c45fSAndroid Build Coastguard Worker  * You may obtain a copy of the License at
7*38e8c45fSAndroid Build Coastguard Worker  *
8*38e8c45fSAndroid Build Coastguard Worker  *      http://www.apache.org/licenses/LICENSE-2.0
9*38e8c45fSAndroid Build Coastguard Worker  *
10*38e8c45fSAndroid Build Coastguard Worker  * Unless required by applicable law or agreed to in writing, software
11*38e8c45fSAndroid Build Coastguard Worker  * distributed under the License is distributed on an "AS IS" BASIS,
12*38e8c45fSAndroid Build Coastguard Worker  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13*38e8c45fSAndroid Build Coastguard Worker  * See the License for the specific language governing permissions and
14*38e8c45fSAndroid Build Coastguard Worker  * limitations under the License.
15*38e8c45fSAndroid Build Coastguard Worker  */
16*38e8c45fSAndroid Build Coastguard Worker 
17*38e8c45fSAndroid Build Coastguard Worker #pragma once
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <android-base/thread_annotations.h>
20*38e8c45fSAndroid Build Coastguard Worker #include <condition_variable>
21*38e8c45fSAndroid Build Coastguard Worker #include <mutex>
22*38e8c45fSAndroid Build Coastguard Worker #include <queue>
23*38e8c45fSAndroid Build Coastguard Worker #include <thread>
24*38e8c45fSAndroid Build Coastguard Worker 
25*38e8c45fSAndroid Build Coastguard Worker #include "renderengine/RenderEngine.h"
26*38e8c45fSAndroid Build Coastguard Worker 
27*38e8c45fSAndroid Build Coastguard Worker namespace android {
28*38e8c45fSAndroid Build Coastguard Worker namespace renderengine {
29*38e8c45fSAndroid Build Coastguard Worker namespace threaded {
30*38e8c45fSAndroid Build Coastguard Worker 
31*38e8c45fSAndroid Build Coastguard Worker using CreateInstanceFactory = std::function<std::unique_ptr<renderengine::RenderEngine>()>;
32*38e8c45fSAndroid Build Coastguard Worker 
33*38e8c45fSAndroid Build Coastguard Worker /**
34*38e8c45fSAndroid Build Coastguard Worker  * This class extends a basic RenderEngine class. It contains a thread. Each time a function of
35*38e8c45fSAndroid Build Coastguard Worker  * this class is called, we create a lambda function that is put on a queue. The main thread then
36*38e8c45fSAndroid Build Coastguard Worker  * executes the functions in order.
37*38e8c45fSAndroid Build Coastguard Worker  */
38*38e8c45fSAndroid Build Coastguard Worker class RenderEngineThreaded : public RenderEngine {
39*38e8c45fSAndroid Build Coastguard Worker public:
40*38e8c45fSAndroid Build Coastguard Worker     static std::unique_ptr<RenderEngineThreaded> create(CreateInstanceFactory factory);
41*38e8c45fSAndroid Build Coastguard Worker 
42*38e8c45fSAndroid Build Coastguard Worker     RenderEngineThreaded(CreateInstanceFactory factory);
43*38e8c45fSAndroid Build Coastguard Worker     ~RenderEngineThreaded() override;
44*38e8c45fSAndroid Build Coastguard Worker     std::future<void> primeCache(PrimeCacheConfig config) override;
45*38e8c45fSAndroid Build Coastguard Worker 
46*38e8c45fSAndroid Build Coastguard Worker     void dump(std::string& result) override;
47*38e8c45fSAndroid Build Coastguard Worker 
48*38e8c45fSAndroid Build Coastguard Worker     size_t getMaxTextureSize() const override;
49*38e8c45fSAndroid Build Coastguard Worker     size_t getMaxViewportDims() const override;
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker     bool supportsProtectedContent() const override;
52*38e8c45fSAndroid Build Coastguard Worker     void cleanupPostRender() override;
53*38e8c45fSAndroid Build Coastguard Worker 
54*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> drawLayers(const DisplaySettings& display,
55*38e8c45fSAndroid Build Coastguard Worker                                         const std::vector<LayerSettings>& layers,
56*38e8c45fSAndroid Build Coastguard Worker                                         const std::shared_ptr<ExternalTexture>& buffer,
57*38e8c45fSAndroid Build Coastguard Worker                                         base::unique_fd&& bufferFence) override;
58*38e8c45fSAndroid Build Coastguard Worker     ftl::Future<FenceResult> drawGainmap(const std::shared_ptr<ExternalTexture>& sdr,
59*38e8c45fSAndroid Build Coastguard Worker                                          base::borrowed_fd&& sdrFence,
60*38e8c45fSAndroid Build Coastguard Worker                                          const std::shared_ptr<ExternalTexture>& hdr,
61*38e8c45fSAndroid Build Coastguard Worker                                          base::borrowed_fd&& hdrFence, float hdrSdrRatio,
62*38e8c45fSAndroid Build Coastguard Worker                                          ui::Dataspace dataspace,
63*38e8c45fSAndroid Build Coastguard Worker                                          const std::shared_ptr<ExternalTexture>& gainmap) override;
64*38e8c45fSAndroid Build Coastguard Worker 
65*38e8c45fSAndroid Build Coastguard Worker     int getContextPriority() override;
66*38e8c45fSAndroid Build Coastguard Worker     bool supportsBackgroundBlur() override;
67*38e8c45fSAndroid Build Coastguard Worker     void onActiveDisplaySizeChanged(ui::Size size) override;
68*38e8c45fSAndroid Build Coastguard Worker     std::optional<pid_t> getRenderEngineTid() const override;
69*38e8c45fSAndroid Build Coastguard Worker     void setEnableTracing(bool tracingEnabled) override;
70*38e8c45fSAndroid Build Coastguard Worker 
71*38e8c45fSAndroid Build Coastguard Worker protected:
72*38e8c45fSAndroid Build Coastguard Worker     void mapExternalTextureBuffer(const sp<GraphicBuffer>& buffer, bool isRenderable) override;
73*38e8c45fSAndroid Build Coastguard Worker     void unmapExternalTextureBuffer(sp<GraphicBuffer>&& buffer) override;
74*38e8c45fSAndroid Build Coastguard Worker     bool canSkipPostRenderCleanup() const override;
75*38e8c45fSAndroid Build Coastguard Worker     void drawLayersInternal(const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
76*38e8c45fSAndroid Build Coastguard Worker                             const DisplaySettings& display,
77*38e8c45fSAndroid Build Coastguard Worker                             const std::vector<LayerSettings>& layers,
78*38e8c45fSAndroid Build Coastguard Worker                             const std::shared_ptr<ExternalTexture>& buffer,
79*38e8c45fSAndroid Build Coastguard Worker                             base::unique_fd&& bufferFence) override;
80*38e8c45fSAndroid Build Coastguard Worker     void drawGainmapInternal(const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
81*38e8c45fSAndroid Build Coastguard Worker                              const std::shared_ptr<ExternalTexture>& sdr,
82*38e8c45fSAndroid Build Coastguard Worker                              base::borrowed_fd&& sdrFence,
83*38e8c45fSAndroid Build Coastguard Worker                              const std::shared_ptr<ExternalTexture>& hdr,
84*38e8c45fSAndroid Build Coastguard Worker                              base::borrowed_fd&& hdrFence, float hdrSdrRatio,
85*38e8c45fSAndroid Build Coastguard Worker                              ui::Dataspace dataspace,
86*38e8c45fSAndroid Build Coastguard Worker                              const std::shared_ptr<ExternalTexture>& gainmap) override;
87*38e8c45fSAndroid Build Coastguard Worker 
88*38e8c45fSAndroid Build Coastguard Worker private:
89*38e8c45fSAndroid Build Coastguard Worker     void threadMain(CreateInstanceFactory factory);
90*38e8c45fSAndroid Build Coastguard Worker     void waitUntilInitialized() const;
91*38e8c45fSAndroid Build Coastguard Worker     static status_t setSchedFifo(bool enabled);
92*38e8c45fSAndroid Build Coastguard Worker 
93*38e8c45fSAndroid Build Coastguard Worker     // No-op. This method is only called on leaf implementations of RenderEngine.
useProtectedContext(bool)94*38e8c45fSAndroid Build Coastguard Worker     void useProtectedContext(bool) override {}
95*38e8c45fSAndroid Build Coastguard Worker 
96*38e8c45fSAndroid Build Coastguard Worker     /* ------------------------------------------------------------------------
97*38e8c45fSAndroid Build Coastguard Worker      * Threading
98*38e8c45fSAndroid Build Coastguard Worker      */
99*38e8c45fSAndroid Build Coastguard Worker     const char* const mThreadName = "RenderEngine";
100*38e8c45fSAndroid Build Coastguard Worker     // Protects the creation and destruction of mThread.
101*38e8c45fSAndroid Build Coastguard Worker     mutable std::mutex mThreadMutex;
102*38e8c45fSAndroid Build Coastguard Worker     std::thread mThread GUARDED_BY(mThreadMutex);
103*38e8c45fSAndroid Build Coastguard Worker     std::atomic<bool> mRunning = true;
104*38e8c45fSAndroid Build Coastguard Worker     std::atomic<bool> mNeedsPostRenderCleanup = false;
105*38e8c45fSAndroid Build Coastguard Worker 
106*38e8c45fSAndroid Build Coastguard Worker     using Work = std::function<void(renderengine::RenderEngine&)>;
107*38e8c45fSAndroid Build Coastguard Worker     mutable std::queue<Work> mFunctionCalls GUARDED_BY(mThreadMutex);
108*38e8c45fSAndroid Build Coastguard Worker     mutable std::condition_variable mCondition;
109*38e8c45fSAndroid Build Coastguard Worker 
110*38e8c45fSAndroid Build Coastguard Worker     // Used to allow select thread safe methods to be accessed without requiring the
111*38e8c45fSAndroid Build Coastguard Worker     // method to be invoked on the RenderEngine thread
112*38e8c45fSAndroid Build Coastguard Worker     std::atomic_bool mIsInitialized = false;
113*38e8c45fSAndroid Build Coastguard Worker     mutable std::mutex mInitializedMutex;
114*38e8c45fSAndroid Build Coastguard Worker     mutable std::condition_variable mInitializedCondition;
115*38e8c45fSAndroid Build Coastguard Worker 
116*38e8c45fSAndroid Build Coastguard Worker     /* ------------------------------------------------------------------------
117*38e8c45fSAndroid Build Coastguard Worker      * Render Engine
118*38e8c45fSAndroid Build Coastguard Worker      */
119*38e8c45fSAndroid Build Coastguard Worker     std::unique_ptr<renderengine::RenderEngine> mRenderEngine;
120*38e8c45fSAndroid Build Coastguard Worker };
121*38e8c45fSAndroid Build Coastguard Worker } // namespace threaded
122*38e8c45fSAndroid Build Coastguard Worker } // namespace renderengine
123*38e8c45fSAndroid Build Coastguard Worker } // namespace android
124