xref: /aosp_15_r20/frameworks/native/libs/renderengine/RenderEngine.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1 /*
2  * Copyright 2013 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 <renderengine/RenderEngine.h>
18 
19 #include "renderengine/ExternalTexture.h"
20 #include "skia/GaneshVkRenderEngine.h"
21 #include "skia/GraphiteVkRenderEngine.h"
22 #include "skia/SkiaGLRenderEngine.h"
23 #include "threaded/RenderEngineThreaded.h"
24 #include "ui/GraphicTypes.h"
25 
26 #include <com_android_graphics_surfaceflinger_flags.h>
27 #include <cutils/properties.h>
28 #include <log/log.h>
29 
30 // TODO: b/341728634 - Clean up conditional compilation.
31 #if COM_ANDROID_GRAPHICS_SURFACEFLINGER_FLAGS(GRAPHITE_RENDERENGINE) || \
32         COM_ANDROID_GRAPHICS_SURFACEFLINGER_FLAGS(FORCE_COMPILE_GRAPHITE_RENDERENGINE)
33 #define COMPILE_GRAPHITE_RENDERENGINE 1
34 #else
35 #define COMPILE_GRAPHITE_RENDERENGINE 0
36 #endif
37 
38 namespace android {
39 namespace renderengine {
40 
create(const RenderEngineCreationArgs & args)41 std::unique_ptr<RenderEngine> RenderEngine::create(const RenderEngineCreationArgs& args) {
42     threaded::CreateInstanceFactory createInstanceFactory;
43 
44 // TODO: b/341728634 - Clean up conditional compilation.
45 #if COMPILE_GRAPHITE_RENDERENGINE
46     const RenderEngine::SkiaBackend actualSkiaBackend = args.skiaBackend;
47 #else
48     if (args.skiaBackend == RenderEngine::SkiaBackend::GRAPHITE) {
49         ALOGE("RenderEngine with Graphite Skia backend was requested, but Graphite was not "
50               "included in the build. Falling back to Ganesh (%s)",
51               args.graphicsApi == RenderEngine::GraphicsApi::GL ? "GL" : "Vulkan");
52     }
53     const RenderEngine::SkiaBackend actualSkiaBackend = RenderEngine::SkiaBackend::GANESH;
54 #endif
55 
56     ALOGD("%sRenderEngine with %s Backend (%s)", args.threaded == Threaded::YES ? "Threaded " : "",
57           args.graphicsApi == GraphicsApi::GL ? "SkiaGL" : "SkiaVK",
58           actualSkiaBackend == SkiaBackend::GANESH ? "Ganesh" : "Graphite");
59 
60 // TODO: b/341728634 - Clean up conditional compilation.
61 #if COMPILE_GRAPHITE_RENDERENGINE
62     if (actualSkiaBackend == SkiaBackend::GRAPHITE) {
63         createInstanceFactory = [args]() {
64             return android::renderengine::skia::GraphiteVkRenderEngine::create(args);
65         };
66     } else
67 #endif
68     { // GANESH
69         if (args.graphicsApi == GraphicsApi::VK) {
70             createInstanceFactory = [args]() {
71                 return android::renderengine::skia::GaneshVkRenderEngine::create(args);
72             };
73         } else { // GL
74             createInstanceFactory = [args]() {
75                 return android::renderengine::skia::SkiaGLRenderEngine::create(args);
76             };
77         }
78     }
79 
80     if (args.threaded == Threaded::YES) {
81         return renderengine::threaded::RenderEngineThreaded::create(createInstanceFactory);
82     } else {
83         return createInstanceFactory();
84     }
85 }
86 
87 RenderEngine::~RenderEngine() = default;
88 
validateInputBufferUsage(const sp<GraphicBuffer> & buffer)89 void RenderEngine::validateInputBufferUsage(const sp<GraphicBuffer>& buffer) {
90     LOG_ALWAYS_FATAL_IF(!(buffer->getUsage() & GraphicBuffer::USAGE_HW_TEXTURE),
91                         "input buffer not gpu readable");
92 }
93 
validateOutputBufferUsage(const sp<GraphicBuffer> & buffer)94 void RenderEngine::validateOutputBufferUsage(const sp<GraphicBuffer>& buffer) {
95     LOG_ALWAYS_FATAL_IF(!(buffer->getUsage() & GraphicBuffer::USAGE_HW_RENDER),
96                         "output buffer not gpu writeable");
97 }
98 
drawLayers(const DisplaySettings & display,const std::vector<LayerSettings> & layers,const std::shared_ptr<ExternalTexture> & buffer,base::unique_fd && bufferFence)99 ftl::Future<FenceResult> RenderEngine::drawLayers(const DisplaySettings& display,
100                                                   const std::vector<LayerSettings>& layers,
101                                                   const std::shared_ptr<ExternalTexture>& buffer,
102                                                   base::unique_fd&& bufferFence) {
103     const auto resultPromise = std::make_shared<std::promise<FenceResult>>();
104     std::future<FenceResult> resultFuture = resultPromise->get_future();
105     updateProtectedContext(layers, {buffer.get()});
106     drawLayersInternal(std::move(resultPromise), display, layers, buffer, std::move(bufferFence));
107     return resultFuture;
108 }
109 
drawGainmap(const std::shared_ptr<ExternalTexture> & sdr,base::borrowed_fd && sdrFence,const std::shared_ptr<ExternalTexture> & hdr,base::borrowed_fd && hdrFence,float hdrSdrRatio,ui::Dataspace dataspace,const std::shared_ptr<ExternalTexture> & gainmap)110 ftl::Future<FenceResult> RenderEngine::drawGainmap(
111         const std::shared_ptr<ExternalTexture>& sdr, base::borrowed_fd&& sdrFence,
112         const std::shared_ptr<ExternalTexture>& hdr, base::borrowed_fd&& hdrFence,
113         float hdrSdrRatio, ui::Dataspace dataspace,
114         const std::shared_ptr<ExternalTexture>& gainmap) {
115     const auto resultPromise = std::make_shared<std::promise<FenceResult>>();
116     std::future<FenceResult> resultFuture = resultPromise->get_future();
117     updateProtectedContext({}, {sdr.get(), hdr.get(), gainmap.get()});
118     drawGainmapInternal(std::move(resultPromise), sdr, std::move(sdrFence), hdr,
119                         std::move(hdrFence), hdrSdrRatio, dataspace, gainmap);
120     return resultFuture;
121 }
122 
updateProtectedContext(const std::vector<LayerSettings> & layers,vector<const ExternalTexture * > buffers)123 void RenderEngine::updateProtectedContext(const std::vector<LayerSettings>& layers,
124                                           vector<const ExternalTexture*> buffers) {
125     const bool needsProtectedContext =
126             std::any_of(layers.begin(), layers.end(),
127                         [](const LayerSettings& layer) {
128                             const std::shared_ptr<ExternalTexture>& buffer =
129                                     layer.source.buffer.buffer;
130                             return buffer && (buffer->getUsage() & GRALLOC_USAGE_PROTECTED);
131                         }) ||
132             std::any_of(buffers.begin(), buffers.end(), [](const ExternalTexture* buffer) {
133                 return buffer && (buffer->getUsage() & GRALLOC_USAGE_PROTECTED);
134             });
135     useProtectedContext(needsProtectedContext);
136 }
137 
138 } // namespace renderengine
139 } // namespace android
140