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