Extensions.h revision a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5
1bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy/*
2bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * Copyright (C) 2010 The Android Open Source Project
3bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy *
4bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * Licensed under the Apache License, Version 2.0 (the "License");
5bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * you may not use this file except in compliance with the License.
6bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * You may obtain a copy of the License at
7bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy *
8bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy *      http://www.apache.org/licenses/LICENSE-2.0
9bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy *
10bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * Unless required by applicable law or agreed to in writing, software
11bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * distributed under the License is distributed on an "AS IS" BASIS,
12bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * See the License for the specific language governing permissions and
14bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy * limitations under the License.
15bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy */
16bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
17bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#ifndef ANDROID_UI_EXTENSIONS_H
18bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#define ANDROID_UI_EXTENSIONS_H
19bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
20bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#include <utils/SortedVector.h>
21bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#include <utils/String8.h>
22bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
23bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#include <GLES2/gl2.h>
24bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#include <GLES2/gl2ext.h>
25bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
26bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guynamespace android {
27bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guynamespace uirenderer {
28bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
29a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy///////////////////////////////////////////////////////////////////////////////
30a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy// Defines
31a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy///////////////////////////////////////////////////////////////////////////////
32a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
33a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy// Debug
34a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#define DEBUG_EXTENSIONS 0
35a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
36a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy// Debug
37a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#if DEBUG_EXTENSIONS
38a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    #define EXT_LOGD(...) LOGD(__VA_ARGS__)
39a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#else
40a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    #define EXT_LOGD(...)
41a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#endif
42a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
43bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guyclass Extensions {
44bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guypublic:
45bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    Extensions() {
46bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* buffer = (const char*) glGetString(GL_EXTENSIONS);
47bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* current = buffer;
48bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* head = current;
49a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        EXT_LOGD("Available GL extensions:");
50bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        do {
51bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            head = strchr(current, ' ');
52bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            String8 s(current, head ? head - current : strlen(current));
53bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            if (s.length()) {
54bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy                mExtensionList.add(s);
55a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy                EXT_LOGD("  %s", s.string());
56bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            }
57bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            current = head + 1;
58bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        } while (head);
59bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
60bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        mHasNPot = hasExtension("GL_OES_texture_npot");
6151769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        mHasDrawPath = hasExtension("GL_NV_draw_path");
6251769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        mHasCoverageSample = hasExtension("GL_NV_coverage_sample");
63a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        mHasFramebufferFetch = hasExtension("GL_NV_shader_framebuffer_fetch");
6451769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
6551769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        mExtensions = buffer;
66bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    }
67bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
68bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    inline bool hasNPot() const { return mHasNPot; }
6951769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    inline bool hasDrawPath() const { return mHasDrawPath; }
7051769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    inline bool hasCoverageSample() const { return mHasCoverageSample; }
71a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    inline bool hasFramebufferFetch() const { return mHasFramebufferFetch; }
72bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
73bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    bool hasExtension(const char* extension) const {
74bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const String8 s(extension);
75bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        return mExtensionList.indexOf(s) >= 0;
76bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    }
77bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
7851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    void dump() {
7951769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        LOGD("Supported extensions:\n%s", mExtensions);
8051769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    }
8151769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
82bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guyprivate:
83bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    SortedVector<String8> mExtensionList;
84bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
8551769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    const char* mExtensions;
8651769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
87bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    bool mHasNPot;
8851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    bool mHasDrawPath;
8951769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    bool mHasCoverageSample;
90a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    bool mHasFramebufferFetch;
91bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // class Extensions
92bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
93bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // namespace uirenderer
94bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // namespace android
95bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
96bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy#endif // ANDROID_UI_EXTENSIONS_H
97