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 #ifndef SF_SKIARENDERENGINE_H_
18 #define SF_SKIARENDERENGINE_H_
19 
20 #include <renderengine/RenderEngine.h>
21 #include <sys/types.h>
22 
23 #include <GrBackendSemaphore.h>
24 #include <SkSurface.h>
25 #include <android-base/thread_annotations.h>
26 #include <renderengine/ExternalTexture.h>
27 #include <renderengine/RenderEngine.h>
28 #include <sys/types.h>
29 
30 #include <memory>
31 #include <mutex>
32 #include <unordered_map>
33 
34 #include "AutoBackendTexture.h"
35 #include "GrContextOptions.h"
36 #include "SkImageInfo.h"
37 #include "android-base/macros.h"
38 #include "compat/SkiaGpuContext.h"
39 #include "debug/SkiaCapture.h"
40 #include "filters/BlurFilter.h"
41 #include "filters/LinearEffect.h"
42 #include "filters/StretchShaderFactory.h"
43 
44 class SkData;
45 
46 struct SkPoint3;
47 
48 namespace android {
49 
50 namespace renderengine {
51 
52 class Mesh;
53 class Texture;
54 
55 namespace skia {
56 
57 class BlurFilter;
58 
59 class SkiaRenderEngine : public RenderEngine {
60 public:
61     static std::unique_ptr<SkiaRenderEngine> create(const RenderEngineCreationArgs& args);
62     SkiaRenderEngine(Threaded, PixelFormat pixelFormat, BlurAlgorithm);
63     ~SkiaRenderEngine() override;
64 
65     std::future<void> primeCache(PrimeCacheConfig config) override final;
66     void cleanupPostRender() override final;
supportsBackgroundBlur()67     bool supportsBackgroundBlur() override final {
68         return mBlurFilter != nullptr;
69     }
70     void onActiveDisplaySizeChanged(ui::Size size) override final;
71     int reportShadersCompiled();
72 
73     virtual void setEnableTracing(bool tracingEnabled) override final;
74 
75     void useProtectedContext(bool useProtectedContext) override;
supportsProtectedContent()76     bool supportsProtectedContent() const override {
77         return supportsProtectedContentImpl();
78     }
79     void ensureContextsCreated();
80 
81 protected:
82     // This is so backends can stop the generic rendering state first before cleaning up
83     // backend-specific state. SkiaGpuContexts are invalid after invocation.
84     void finishRenderingAndAbandonContexts();
85 
86     // Functions that a given backend (GLES, Vulkan) must implement
87     using Contexts = std::pair<unique_ptr<SkiaGpuContext>, unique_ptr<SkiaGpuContext>>;
88     virtual Contexts createContexts() = 0;
89     virtual bool supportsProtectedContentImpl() const = 0;
90     virtual bool useProtectedContextImpl(GrProtected isProtected) = 0;
91     virtual void waitFence(SkiaGpuContext* context, base::borrowed_fd fenceFd) = 0;
92     virtual base::unique_fd flushAndSubmit(SkiaGpuContext* context,
93                                            sk_sp<SkSurface> dstSurface) = 0;
94     virtual void appendBackendSpecificInfoToDump(std::string& result) = 0;
95 
96     size_t getMaxTextureSize() const override final;
97     size_t getMaxViewportDims() const override final;
98     // TODO: b/293371537 - Return reference instead of pointer? (Cleanup)
99     SkiaGpuContext* getActiveContext();
100 
isProtected()101     bool isProtected() const { return mInProtectedContext; }
102 
103     // Implements PersistentCache as a way to monitor what SkSL shaders Skia has
104     // cached.
105     class SkSLCacheMonitor : public GrContextOptions::PersistentCache {
106     public:
107         SkSLCacheMonitor() = default;
108         ~SkSLCacheMonitor() override = default;
109 
110         sk_sp<SkData> load(const SkData& key) override;
111 
112         void store(const SkData& key, const SkData& data, const SkString& description) override;
113 
shadersCachedSinceLastCall()114         int shadersCachedSinceLastCall() {
115             const int shadersCachedSinceLastCall = mShadersCachedSinceLastCall;
116             mShadersCachedSinceLastCall = 0;
117             return shadersCachedSinceLastCall;
118         }
119 
totalShadersCompiled()120         int totalShadersCompiled() const { return mTotalShadersCompiled; }
121 
122     private:
123         int mShadersCachedSinceLastCall = 0;
124         int mTotalShadersCompiled = 0;
125     };
126 
127     SkSLCacheMonitor mSkSLCacheMonitor;
128 
129 private:
130     void mapExternalTextureBuffer(const sp<GraphicBuffer>& buffer,
131                                   bool isRenderable) override final;
132     void unmapExternalTextureBuffer(sp<GraphicBuffer>&& buffer) override final;
133     bool canSkipPostRenderCleanup() const override final;
134 
135     std::shared_ptr<AutoBackendTexture::LocalRef> getOrCreateBackendTexture(
136             const sp<GraphicBuffer>& buffer, bool isOutputBuffer) REQUIRES(mRenderingMutex);
137     void initCanvas(SkCanvas* canvas, const DisplaySettings& display);
138     void drawShadow(SkCanvas* canvas, const SkRRect& casterRRect,
139                     const ShadowSettings& shadowSettings);
140     void drawLayersInternal(const std::shared_ptr<std::promise<FenceResult>>&& resultPromise,
141                             const DisplaySettings& display,
142                             const std::vector<LayerSettings>& layers,
143                             const std::shared_ptr<ExternalTexture>& buffer,
144                             base::unique_fd&& bufferFence) override final;
145 
146     void dump(std::string& result) override final;
147 
148     // If requiresLinearEffect is true or the layer has a stretchEffect a new shader is returned.
149     // Otherwise it returns the input shader.
150     struct RuntimeEffectShaderParameters {
151         sk_sp<SkShader> shader;
152         const LayerSettings& layer;
153         const DisplaySettings& display;
154         bool undoPremultipliedAlpha;
155         bool requiresLinearEffect;
156         float layerDimmingRatio;
157         const ui::Dataspace outputDataSpace;
158         const ui::Dataspace fakeOutputDataspace;
159     };
160     sk_sp<SkShader> createRuntimeEffectShader(const RuntimeEffectShaderParameters&);
161 
162     const PixelFormat mDefaultPixelFormat;
163 
164     // Identifier used for various mappings of layers to various
165     // textures or shaders
166     using GraphicBufferId = uint64_t;
167 
168     // Number of external holders of ExternalTexture references, per GraphicBuffer ID.
169     std::unordered_map<GraphicBufferId, int32_t> mGraphicBufferExternalRefs
170             GUARDED_BY(mRenderingMutex);
171     std::unordered_map<GraphicBufferId, std::shared_ptr<AutoBackendTexture::LocalRef>> mTextureCache
172             GUARDED_BY(mRenderingMutex);
173     std::unordered_map<shaders::LinearEffect, sk_sp<SkRuntimeEffect>, shaders::LinearEffectHasher>
174             mRuntimeEffects;
175     AutoBackendTexture::CleanupManager mTextureCleanupMgr GUARDED_BY(mRenderingMutex);
176 
177     StretchShaderFactory mStretchShaderFactory;
178 
179     sp<Fence> mLastDrawFence;
180     BlurFilter* mBlurFilter = nullptr;
181 
182     // Object to capture commands send to Skia.
183     std::unique_ptr<SkiaCapture> mCapture;
184 
185     // Mutex guarding rendering operations, so that internal state related to
186     // rendering that is potentially modified by multiple threads is guaranteed thread-safe.
187     mutable std::mutex mRenderingMutex;
188 
189     // Graphics context used for creating surfaces and submitting commands
190     unique_ptr<SkiaGpuContext> mContext;
191     // Same as above, but for protected content (eg. DRM)
192     unique_ptr<SkiaGpuContext> mProtectedContext;
193     bool mInProtectedContext = false;
194 };
195 
196 } // namespace skia
197 } // namespace renderengine
198 } // namespace android
199 
200 #endif /* SF_GLESRENDERENGINE_H_ */
201