Extensions.h revision 9c4b79af221b53f602f946faa9ff317a596a0c39
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
175b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#ifndef ANDROID_HWUI_EXTENSIONS_H
185b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#define ANDROID_HWUI_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
26a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy#include "Debug.h"
27a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy
28bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guynamespace android {
29bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guynamespace uirenderer {
30bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
31a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy///////////////////////////////////////////////////////////////////////////////
32a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy// Defines
33a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy///////////////////////////////////////////////////////////////////////////////
34a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
35a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy// Debug
36a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#if DEBUG_EXTENSIONS
37a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    #define EXT_LOGD(...) LOGD(__VA_ARGS__)
38a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#else
39a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    #define EXT_LOGD(...)
40a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy#endif
41a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy
42a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy// Vendor strings
43a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy
44a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy#define VENDOR_IMG "Imagination Technologies"
45a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy
46a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy///////////////////////////////////////////////////////////////////////////////
47a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy// Classes
48a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy///////////////////////////////////////////////////////////////////////////////
49a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy
50bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guyclass Extensions {
51bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guypublic:
52bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    Extensions() {
53bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* buffer = (const char*) glGetString(GL_EXTENSIONS);
54bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* current = buffer;
55bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const char* head = current;
56a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        EXT_LOGD("Available GL extensions:");
57bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        do {
58bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            head = strchr(current, ' ');
59bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            String8 s(current, head ? head - current : strlen(current));
60bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            if (s.length()) {
61bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy                mExtensionList.add(s);
62a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy                EXT_LOGD("  %s", s.string());
63bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            }
64bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy            current = head + 1;
65bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        } while (head);
66bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
67bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        mHasNPot = hasExtension("GL_OES_texture_npot");
68a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy        mHasFramebufferFetch = hasExtension("GL_NV_shader_framebuffer_fetch");
699c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy        mHasDiscardFramebuffer = hasExtension("GL_EXT_discard_framebuffer");
7051769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
71a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        const char* vendor = (const char*) glGetString(GL_VENDOR);
72a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        EXT_LOGD("Vendor: %s", vendor);
73a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        mNeedsHighpTexCoords = strcmp(vendor, VENDOR_IMG) == 0;
74a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy
75a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        // We don't need to copy the string, the OpenGL ES spec
76a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        // guarantees the result of glGetString to point to a
77a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy        // static string as long as our OpenGL context is valid
7851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        mExtensions = buffer;
79bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    }
80bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
81bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    inline bool hasNPot() const { return mHasNPot; }
82a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    inline bool hasFramebufferFetch() const { return mHasFramebufferFetch; }
83a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy    inline bool needsHighpTexCoords() const { return mNeedsHighpTexCoords; }
849c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy    inline bool hasDiscardFramebuffer() const { return mHasDiscardFramebuffer; }
85bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
86bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    bool hasExtension(const char* extension) const {
87bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        const String8 s(extension);
88bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy        return mExtensionList.indexOf(s) >= 0;
89bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    }
90bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
9151769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    void dump() {
9251769a68a5cb34e9564740c6a854fcb93018789dRomain Guy        LOGD("Supported extensions:\n%s", mExtensions);
9351769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    }
9451769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
95bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guyprivate:
96bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    SortedVector<String8> mExtensionList;
97bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
9851769a68a5cb34e9564740c6a854fcb93018789dRomain Guy    const char* mExtensions;
9951769a68a5cb34e9564740c6a854fcb93018789dRomain Guy
100bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy    bool mHasNPot;
101a60c3889718f4513a6c9d8b80f655db5d6346905Romain Guy    bool mNeedsHighpTexCoords;
102a5aed0d58962a24c44728ffc46dc9e1ba2f9fda5Romain Guy    bool mHasFramebufferFetch;
1039c4b79af221b53f602f946faa9ff317a596a0c39Romain Guy    bool mHasDiscardFramebuffer;
104bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // class Extensions
105bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
106bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // namespace uirenderer
107bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy}; // namespace android
108bd0e6aa0ff0bd8b376772c3e23513a6021bdda87Romain Guy
1095b3b35296e8b2c8d3f07d32bb645d5414db41a1dRomain Guy#endif // ANDROID_HWUI_EXTENSIONS_H
110