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