xref: /aosp_15_r20/frameworks/av/media/libstagefright/renderfright/RenderEngine.cpp (revision ec779b8e0859a360c3d303172224686826e6e0e1)
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 <cutils/properties.h>
20 #include <log/log.h>
21 #include "gl/GLESRenderEngine.h"
22 #include "threaded/RenderEngineThreaded.h"
23 
24 namespace android {
25 namespace renderengine {
26 
create(const RenderEngineCreationArgs & args)27 std::unique_ptr<RenderEngine> RenderEngine::create(const RenderEngineCreationArgs& args) {
28     RenderEngineType renderEngineType = args.renderEngineType;
29 
30     // Keep the ability to override by PROPERTIES:
31     char prop[PROPERTY_VALUE_MAX];
32     property_get(PROPERTY_DEBUG_RENDERENGINE_BACKEND, prop, "");
33     if (strcmp(prop, "gles") == 0) {
34         renderEngineType = RenderEngineType::GLES;
35     }
36     if (strcmp(prop, "threaded") == 0) {
37         renderEngineType = RenderEngineType::THREADED;
38     }
39 
40     switch (renderEngineType) {
41         case RenderEngineType::THREADED:
42             ALOGD("Threaded RenderEngine with GLES Backend");
43             return renderengine::threaded::RenderEngineThreaded::create(
44                     [args]() { return android::renderengine::gl::GLESRenderEngine::create(args); });
45         case RenderEngineType::GLES:
46         default:
47             ALOGD("RenderEngine with GLES Backend");
48             return renderengine::gl::GLESRenderEngine::create(args);
49     }
50 }
51 
52 RenderEngine::~RenderEngine() = default;
53 
54 // static
GetInstance()55 SyncFeatures &SyncFeatures::GetInstance() {
56     static SyncFeatures syncFeatures;
57     return syncFeatures;
58 }
59 
useNativeFenceSync() const60 bool SyncFeatures::useNativeFenceSync() const { return mHasNativeFenceSync; }
useFenceSync() const61 bool SyncFeatures::useFenceSync() const { return mHasFenceSync; }
useWaitSync() const62 bool SyncFeatures::useWaitSync() const { return mHasWaitSync; }
63 
SyncFeatures()64 SyncFeatures::SyncFeatures()
65     : mHasNativeFenceSync(false),
66       mHasFenceSync(false),
67       mHasWaitSync(false) {
68     EGLDisplay dpy = eglGetDisplay(EGL_DEFAULT_DISPLAY);
69     // This can only be called after EGL has been initialized; otherwise the
70     // check below will abort.
71     const char* exts = eglQueryString(dpy, EGL_EXTENSIONS);
72     LOG_ALWAYS_FATAL_IF(exts == nullptr, "eglQueryString failed");
73     if (strstr(exts, "EGL_ANDROID_native_fence_sync")) {
74         // This makes GLConsumer use the EGL_ANDROID_native_fence_sync
75         // extension to create Android native fences to signal when all
76         // GLES reads for a given buffer have completed.
77         mHasNativeFenceSync = true;
78     }
79     if (strstr(exts, "EGL_KHR_fence_sync")) {
80         mHasFenceSync = true;
81     }
82     if (strstr(exts, "EGL_KHR_wait_sync")) {
83         mHasWaitSync = true;
84     }
85 }
86 
87 namespace impl {
88 
RenderEngine(const RenderEngineCreationArgs & args)89 RenderEngine::RenderEngine(const RenderEngineCreationArgs& args) : mArgs(args) {}
90 
91 RenderEngine::~RenderEngine() = default;
92 
useNativeFenceSync() const93 bool RenderEngine::useNativeFenceSync() const {
94     return SyncFeatures::GetInstance().useNativeFenceSync();
95 }
96 
useWaitSync() const97 bool RenderEngine::useWaitSync() const {
98     return SyncFeatures::GetInstance().useWaitSync();
99 }
100 
101 } // namespace impl
102 } // namespace renderengine
103 } // namespace android
104