1781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian/*
2781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * Copyright (C) 2010 The Android Open Source Project
3781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian *
4781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * Licensed under the Apache License, Version 2.0 (the "License");
5781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * you may not use this file except in compliance with the License.
6781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * You may obtain a copy of the License at
7781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian *
8781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian *      http://www.apache.org/licenses/LICENSE-2.0
9781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian *
10781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * Unless required by applicable law or agreed to in writing, software
11781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * distributed under the License is distributed on an "AS IS" BASIS,
12781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * See the License for the specific language governing permissions and
14781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian * limitations under the License.
15781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian */
16781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
17781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#include <stdlib.h>
18781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#include <stdio.h>
19781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#include <stdint.h>
20781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
21781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#include "GLExtensions.h"
22781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
23781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopiannamespace android {
24781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian// ---------------------------------------------------------------------------
25781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
26781953d62dc17d761e39540f0480e5ca7451cdbeMathias AgopianANDROID_SINGLETON_STATIC_INSTANCE( GLExtensions )
27781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
28781953d62dc17d761e39540f0480e5ca7451cdbeMathias AgopianGLExtensions::GLExtensions()
29781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    : mHaveTextureExternal(false),
30781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian      mHaveNpot(false),
31781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian      mHaveDirectTexture(false)
32781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian{
33781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
34781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
35781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianvoid GLExtensions::initWithGLStrings(
36781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        GLubyte const* vendor,
37781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        GLubyte const* renderer,
38781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        GLubyte const* version,
39781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        GLubyte const* extensions,
40781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        char const* egl_vendor,
41781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        char const* egl_version,
42781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        char const* egl_extensions)
43781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian{
44781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mVendor     = (char const*)vendor;
45781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mRenderer   = (char const*)renderer;
46781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mVersion    = (char const*)version;
47781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mExtensions = (char const*)extensions;
48781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mEglVendor     = egl_vendor;
49781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mEglVersion    = egl_version;
50781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    mEglExtensions = egl_extensions;
51781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
52781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    char const* curr = (char const*)extensions;
53781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    char const* head = curr;
54781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    do {
55781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        head = strchr(curr, ' ');
56781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        String8 s(curr, head ? head-curr : strlen(curr));
57781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        if (s.length()) {
58781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian            mExtensionList.add(s);
59781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        }
60781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        curr = head+1;
61781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    } while (head);
62781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
63781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    curr = egl_extensions;
64781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    head = curr;
65781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    do {
66781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        head = strchr(curr, ' ');
67781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        String8 s(curr, head ? head-curr : strlen(curr));
68781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        if (s.length()) {
69781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian            mExtensionList.add(s);
70781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        }
71781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        curr = head+1;
72781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    } while (head);
73781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
74781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#ifdef EGL_ANDROID_image_native_buffer
75781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    if (hasExtension("GL_OES_EGL_image") &&
76781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        (hasExtension("EGL_KHR_image_base") || hasExtension("EGL_KHR_image")) &&
77781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        hasExtension("EGL_ANDROID_image_native_buffer"))
78781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    {
79781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        mHaveDirectTexture = true;
80781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    }
81781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#else
82781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#warning "EGL_ANDROID_image_native_buffer not supported"
83781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian#endif
84781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
85781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    if (hasExtension("GL_ARB_texture_non_power_of_two")) {
86781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        mHaveNpot = true;
87781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    }
88781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
89e20a56d929fc8fedc2b468ea6d1900bd2aa6e81aMichael I. Gold    if (hasExtension("GL_OES_EGL_image_external")) {
90781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        mHaveTextureExternal = true;
91781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    } else if (strstr(mRenderer.string(), "Adreno")) {
92781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        // hack for Adreno 200
93781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian        mHaveTextureExternal = true;
94781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    }
95ca5edbeba92b96913291792a4df984e158853b6dMathias Agopian
96ca5edbeba92b96913291792a4df984e158853b6dMathias Agopian    if (hasExtension("GL_OES_framebuffer_object")) {
97ca5edbeba92b96913291792a4df984e158853b6dMathias Agopian        mHaveFramebufferObject = true;
98ca5edbeba92b96913291792a4df984e158853b6dMathias Agopian    }
99781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
100781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
101781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianbool GLExtensions::hasExtension(char const* extension) const
102781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian{
103781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    const String8 s(extension);
104781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mExtensionList.indexOf(s) >= 0;
105781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
106781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
107781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getVendor() const {
108781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mVendor.string();
109781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
110781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
111781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getRenderer() const {
112781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mRenderer.string();
113781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
114781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
115781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getVersion() const {
116781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mVersion.string();
117781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
118781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
119781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getExtension() const {
120781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mExtensions.string();
121781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
122781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
123781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getEglVendor() const {
124781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mEglVendor.string();
125781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
126781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
127781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getEglVersion() const {
128781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mEglVersion.string();
129781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
130781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
131781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopianchar const* GLExtensions::getEglExtension() const {
132781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian    return mEglExtensions.string();
133781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}
134781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
135781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian
136781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian// ---------------------------------------------------------------------------
137781953d62dc17d761e39540f0480e5ca7451cdbeMathias Agopian}; // namespace android
138