• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (C) 2010 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 <stdlib.h>
18 #include <stdio.h>
19 #include <stdint.h>
20 
21 #include "GLExtensions.h"
22 
23 namespace android {
24 // ---------------------------------------------------------------------------
25 
ANDROID_SINGLETON_STATIC_INSTANCE(GLExtensions)26 ANDROID_SINGLETON_STATIC_INSTANCE( GLExtensions )
27 
28 GLExtensions::GLExtensions()
29     : mHaveTextureExternal(false),
30       mHaveNpot(false),
31       mHaveDirectTexture(false),
32       mHaveFramebufferObject(false)
33 {
34 }
35 
initWithGLStrings(GLubyte const * vendor,GLubyte const * renderer,GLubyte const * version,GLubyte const * extensions,char const * egl_vendor,char const * egl_version,char const * egl_extensions)36 void GLExtensions::initWithGLStrings(
37         GLubyte const* vendor,
38         GLubyte const* renderer,
39         GLubyte const* version,
40         GLubyte const* extensions,
41         char const* egl_vendor,
42         char const* egl_version,
43         char const* egl_extensions)
44 {
45     mVendor     = (char const*)vendor;
46     mRenderer   = (char const*)renderer;
47     mVersion    = (char const*)version;
48     mExtensions = (char const*)extensions;
49     mEglVendor     = egl_vendor;
50     mEglVersion    = egl_version;
51     mEglExtensions = egl_extensions;
52 
53     char const* curr = (char const*)extensions;
54     char const* head = curr;
55     do {
56         head = strchr(curr, ' ');
57         String8 s(curr, head ? head-curr : strlen(curr));
58         if (s.length()) {
59             mExtensionList.add(s);
60         }
61         curr = head+1;
62     } while (head);
63 
64     curr = egl_extensions;
65     head = curr;
66     do {
67         head = strchr(curr, ' ');
68         String8 s(curr, head ? head-curr : strlen(curr));
69         if (s.length()) {
70             mExtensionList.add(s);
71         }
72         curr = head+1;
73     } while (head);
74 
75 #ifdef EGL_ANDROID_image_native_buffer
76     if (hasExtension("GL_OES_EGL_image") &&
77         (hasExtension("EGL_KHR_image_base") || hasExtension("EGL_KHR_image")) &&
78         hasExtension("EGL_ANDROID_image_native_buffer"))
79     {
80         mHaveDirectTexture = true;
81     }
82 #else
83 #error "EGL_ANDROID_image_native_buffer not supported"
84 #endif
85 
86     if (hasExtension("GL_ARB_texture_non_power_of_two")) {
87         mHaveNpot = true;
88     }
89 
90     if (hasExtension("GL_OES_EGL_image_external")) {
91         mHaveTextureExternal = true;
92     } else if (strstr(mRenderer.string(), "Adreno")) {
93         // hack for Adreno 200
94         mHaveTextureExternal = true;
95     }
96 
97     if (hasExtension("GL_OES_framebuffer_object")) {
98         mHaveFramebufferObject = true;
99     }
100 }
101 
hasExtension(char const * extension) const102 bool GLExtensions::hasExtension(char const* extension) const
103 {
104     const String8 s(extension);
105     return mExtensionList.indexOf(s) >= 0;
106 }
107 
getVendor() const108 char const* GLExtensions::getVendor() const {
109     return mVendor.string();
110 }
111 
getRenderer() const112 char const* GLExtensions::getRenderer() const {
113     return mRenderer.string();
114 }
115 
getVersion() const116 char const* GLExtensions::getVersion() const {
117     return mVersion.string();
118 }
119 
getExtension() const120 char const* GLExtensions::getExtension() const {
121     return mExtensions.string();
122 }
123 
getEglVendor() const124 char const* GLExtensions::getEglVendor() const {
125     return mEglVendor.string();
126 }
127 
getEglVersion() const128 char const* GLExtensions::getEglVersion() const {
129     return mEglVersion.string();
130 }
131 
getEglExtension() const132 char const* GLExtensions::getEglExtension() const {
133     return mEglExtensions.string();
134 }
135 
136 
137 // ---------------------------------------------------------------------------
138 }; // namespace android
139