xref: /aosp_15_r20/frameworks/native/libs/renderengine/skia/GLExtensions.cpp (revision 38e8c45f13ce32b0dcecb25141ffecaf386fa17f)
1*38e8c45fSAndroid Build Coastguard Worker /*
2*38e8c45fSAndroid Build Coastguard Worker  * Copyright (C) 2010 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 #include "GLExtensions.h"
18*38e8c45fSAndroid Build Coastguard Worker 
19*38e8c45fSAndroid Build Coastguard Worker #include <string>
20*38e8c45fSAndroid Build Coastguard Worker #include <unordered_set>
21*38e8c45fSAndroid Build Coastguard Worker 
22*38e8c45fSAndroid Build Coastguard Worker #include <stdint.h>
23*38e8c45fSAndroid Build Coastguard Worker #include <stdio.h>
24*38e8c45fSAndroid Build Coastguard Worker #include <stdlib.h>
25*38e8c45fSAndroid Build Coastguard Worker 
26*38e8c45fSAndroid Build Coastguard Worker ANDROID_SINGLETON_STATIC_INSTANCE(android::renderengine::skia::GLExtensions)
27*38e8c45fSAndroid Build Coastguard Worker 
28*38e8c45fSAndroid Build Coastguard Worker namespace android {
29*38e8c45fSAndroid Build Coastguard Worker namespace renderengine {
30*38e8c45fSAndroid Build Coastguard Worker namespace skia {
31*38e8c45fSAndroid Build Coastguard Worker 
32*38e8c45fSAndroid Build Coastguard Worker namespace {
33*38e8c45fSAndroid Build Coastguard Worker 
34*38e8c45fSAndroid Build Coastguard Worker class ExtensionSet {
35*38e8c45fSAndroid Build Coastguard Worker public:
ExtensionSet(const char * extensions)36*38e8c45fSAndroid Build Coastguard Worker     ExtensionSet(const char* extensions) {
37*38e8c45fSAndroid Build Coastguard Worker         char const* curr = extensions;
38*38e8c45fSAndroid Build Coastguard Worker         char const* head = curr;
39*38e8c45fSAndroid Build Coastguard Worker         do {
40*38e8c45fSAndroid Build Coastguard Worker             head = strchr(curr, ' ');
41*38e8c45fSAndroid Build Coastguard Worker             size_t len = head ? head - curr : strlen(curr);
42*38e8c45fSAndroid Build Coastguard Worker             if (len > 0) {
43*38e8c45fSAndroid Build Coastguard Worker                 mExtensions.emplace(curr, len);
44*38e8c45fSAndroid Build Coastguard Worker             }
45*38e8c45fSAndroid Build Coastguard Worker             curr = head + 1;
46*38e8c45fSAndroid Build Coastguard Worker         } while (head);
47*38e8c45fSAndroid Build Coastguard Worker     }
48*38e8c45fSAndroid Build Coastguard Worker 
hasExtension(const char * extension) const49*38e8c45fSAndroid Build Coastguard Worker     bool hasExtension(const char* extension) const { return mExtensions.count(extension) > 0; }
50*38e8c45fSAndroid Build Coastguard Worker 
51*38e8c45fSAndroid Build Coastguard Worker private:
52*38e8c45fSAndroid Build Coastguard Worker     std::unordered_set<std::string> mExtensions;
53*38e8c45fSAndroid Build Coastguard Worker };
54*38e8c45fSAndroid Build Coastguard Worker 
55*38e8c45fSAndroid Build Coastguard Worker } // anonymous namespace
56*38e8c45fSAndroid Build Coastguard Worker 
initWithGLStrings(GLubyte const * vendor,GLubyte const * renderer,GLubyte const * version,GLubyte const * extensions)57*38e8c45fSAndroid Build Coastguard Worker void GLExtensions::initWithGLStrings(GLubyte const* vendor, GLubyte const* renderer,
58*38e8c45fSAndroid Build Coastguard Worker                                      GLubyte const* version, GLubyte const* extensions) {
59*38e8c45fSAndroid Build Coastguard Worker     mVendor = (char const*)vendor;
60*38e8c45fSAndroid Build Coastguard Worker     mRenderer = (char const*)renderer;
61*38e8c45fSAndroid Build Coastguard Worker     mVersion = (char const*)version;
62*38e8c45fSAndroid Build Coastguard Worker     mExtensions = (char const*)extensions;
63*38e8c45fSAndroid Build Coastguard Worker 
64*38e8c45fSAndroid Build Coastguard Worker     ExtensionSet extensionSet(mExtensions.c_str());
65*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("GL_EXT_protected_textures")) {
66*38e8c45fSAndroid Build Coastguard Worker         mHasProtectedTexture = true;
67*38e8c45fSAndroid Build Coastguard Worker     }
68*38e8c45fSAndroid Build Coastguard Worker }
69*38e8c45fSAndroid Build Coastguard Worker 
getVendor() const70*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getVendor() const {
71*38e8c45fSAndroid Build Coastguard Worker     return mVendor.c_str();
72*38e8c45fSAndroid Build Coastguard Worker }
73*38e8c45fSAndroid Build Coastguard Worker 
getRenderer() const74*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getRenderer() const {
75*38e8c45fSAndroid Build Coastguard Worker     return mRenderer.c_str();
76*38e8c45fSAndroid Build Coastguard Worker }
77*38e8c45fSAndroid Build Coastguard Worker 
getVersion() const78*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getVersion() const {
79*38e8c45fSAndroid Build Coastguard Worker     return mVersion.c_str();
80*38e8c45fSAndroid Build Coastguard Worker }
81*38e8c45fSAndroid Build Coastguard Worker 
getExtensions() const82*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getExtensions() const {
83*38e8c45fSAndroid Build Coastguard Worker     return mExtensions.c_str();
84*38e8c45fSAndroid Build Coastguard Worker }
85*38e8c45fSAndroid Build Coastguard Worker 
initWithEGLStrings(char const * eglVersion,char const * eglExtensions)86*38e8c45fSAndroid Build Coastguard Worker void GLExtensions::initWithEGLStrings(char const* eglVersion, char const* eglExtensions) {
87*38e8c45fSAndroid Build Coastguard Worker     mEGLVersion = eglVersion;
88*38e8c45fSAndroid Build Coastguard Worker     mEGLExtensions = eglExtensions;
89*38e8c45fSAndroid Build Coastguard Worker 
90*38e8c45fSAndroid Build Coastguard Worker     ExtensionSet extensionSet(eglExtensions);
91*38e8c45fSAndroid Build Coastguard Worker 
92*38e8c45fSAndroid Build Coastguard Worker     // EGL_ANDROIDX_no_config_context is an experimental extension with no
93*38e8c45fSAndroid Build Coastguard Worker     // written specification. It will be replaced by something more formal.
94*38e8c45fSAndroid Build Coastguard Worker     // SurfaceFlinger is using it to allow a single EGLContext to render to
95*38e8c45fSAndroid Build Coastguard Worker     // both a 16-bit primary display framebuffer and a 32-bit virtual display
96*38e8c45fSAndroid Build Coastguard Worker     // framebuffer.
97*38e8c45fSAndroid Build Coastguard Worker     //
98*38e8c45fSAndroid Build Coastguard Worker     // EGL_KHR_no_config_context is official extension to allow creating a
99*38e8c45fSAndroid Build Coastguard Worker     // context that works with any surface of a display.
100*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_ANDROIDX_no_config_context") ||
101*38e8c45fSAndroid Build Coastguard Worker         extensionSet.hasExtension("EGL_KHR_no_config_context")) {
102*38e8c45fSAndroid Build Coastguard Worker         mHasNoConfigContext = true;
103*38e8c45fSAndroid Build Coastguard Worker     }
104*38e8c45fSAndroid Build Coastguard Worker 
105*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_ANDROID_native_fence_sync")) {
106*38e8c45fSAndroid Build Coastguard Worker         mHasNativeFenceSync = true;
107*38e8c45fSAndroid Build Coastguard Worker     }
108*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_KHR_fence_sync")) {
109*38e8c45fSAndroid Build Coastguard Worker         mHasFenceSync = true;
110*38e8c45fSAndroid Build Coastguard Worker     }
111*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_KHR_wait_sync")) {
112*38e8c45fSAndroid Build Coastguard Worker         mHasWaitSync = true;
113*38e8c45fSAndroid Build Coastguard Worker     }
114*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_EXT_protected_content")) {
115*38e8c45fSAndroid Build Coastguard Worker         mHasProtectedContent = true;
116*38e8c45fSAndroid Build Coastguard Worker     }
117*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_IMG_context_priority")) {
118*38e8c45fSAndroid Build Coastguard Worker         mHasContextPriority = true;
119*38e8c45fSAndroid Build Coastguard Worker     }
120*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_KHR_surfaceless_context")) {
121*38e8c45fSAndroid Build Coastguard Worker         mHasSurfacelessContext = true;
122*38e8c45fSAndroid Build Coastguard Worker     }
123*38e8c45fSAndroid Build Coastguard Worker 
124*38e8c45fSAndroid Build Coastguard Worker     if (extensionSet.hasExtension("EGL_NV_context_priority_realtime")) {
125*38e8c45fSAndroid Build Coastguard Worker         mHasRealtimePriority = true;
126*38e8c45fSAndroid Build Coastguard Worker     }
127*38e8c45fSAndroid Build Coastguard Worker }
128*38e8c45fSAndroid Build Coastguard Worker 
getEGLVersion() const129*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getEGLVersion() const {
130*38e8c45fSAndroid Build Coastguard Worker     return mEGLVersion.c_str();
131*38e8c45fSAndroid Build Coastguard Worker }
132*38e8c45fSAndroid Build Coastguard Worker 
getEGLExtensions() const133*38e8c45fSAndroid Build Coastguard Worker char const* GLExtensions::getEGLExtensions() const {
134*38e8c45fSAndroid Build Coastguard Worker     return mEGLExtensions.c_str();
135*38e8c45fSAndroid Build Coastguard Worker }
136*38e8c45fSAndroid Build Coastguard Worker 
137*38e8c45fSAndroid Build Coastguard Worker } // namespace skia
138*38e8c45fSAndroid Build Coastguard Worker } // namespace renderengine
139*38e8c45fSAndroid Build Coastguard Worker } // namespace android
140