diff options
Diffstat (limited to 'services/surfaceflinger/GLExtensions.cpp')
| -rw-r--r-- | services/surfaceflinger/GLExtensions.cpp | 133 | 
1 files changed, 133 insertions, 0 deletions
| diff --git a/services/surfaceflinger/GLExtensions.cpp b/services/surfaceflinger/GLExtensions.cpp new file mode 100644 index 000000000000..7f4f9fc074b4 --- /dev/null +++ b/services/surfaceflinger/GLExtensions.cpp @@ -0,0 +1,133 @@ +/* + * Copyright (C) 2010 The Android Open Source Project + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + *      http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +#include <stdlib.h> +#include <stdio.h> +#include <stdint.h> + +#include "GLExtensions.h" + +namespace android { +// --------------------------------------------------------------------------- + +ANDROID_SINGLETON_STATIC_INSTANCE( GLExtensions ) + +GLExtensions::GLExtensions() +    : mHaveTextureExternal(false), +      mHaveNpot(false), +      mHaveDirectTexture(false) +{ +} + +void GLExtensions::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) +{ +    mVendor     = (char const*)vendor; +    mRenderer   = (char const*)renderer; +    mVersion    = (char const*)version; +    mExtensions = (char const*)extensions; +    mEglVendor     = egl_vendor; +    mEglVersion    = egl_version; +    mEglExtensions = egl_extensions; + +    char const* curr = (char const*)extensions; +    char const* head = curr; +    do { +        head = strchr(curr, ' '); +        String8 s(curr, head ? head-curr : strlen(curr)); +        if (s.length()) { +            mExtensionList.add(s); +        } +        curr = head+1; +    } while (head); + +    curr = egl_extensions; +    head = curr; +    do { +        head = strchr(curr, ' '); +        String8 s(curr, head ? head-curr : strlen(curr)); +        if (s.length()) { +            mExtensionList.add(s); +        } +        curr = head+1; +    } while (head); + +#ifdef EGL_ANDROID_image_native_buffer +    if (hasExtension("GL_OES_EGL_image") && +        (hasExtension("EGL_KHR_image_base") || hasExtension("EGL_KHR_image")) && +        hasExtension("EGL_ANDROID_image_native_buffer")) +    { +        mHaveDirectTexture = true; +    } +#else +#warning "EGL_ANDROID_image_native_buffer not supported" +#endif + +    if (hasExtension("GL_ARB_texture_non_power_of_two")) { +        mHaveNpot = true; +    } + +    if (hasExtension("GL_OES_texture_external")) { +        mHaveTextureExternal = true; +    } else if (strstr(mRenderer.string(), "Adreno")) { +        // hack for Adreno 200 +        mHaveTextureExternal = true; +    } +} + +bool GLExtensions::hasExtension(char const* extension) const +{ +    const String8 s(extension); +    return mExtensionList.indexOf(s) >= 0; +} + +char const* GLExtensions::getVendor() const { +    return mVendor.string(); +} + +char const* GLExtensions::getRenderer() const { +    return mRenderer.string(); +} + +char const* GLExtensions::getVersion() const { +    return mVersion.string(); +} + +char const* GLExtensions::getExtension() const { +    return mExtensions.string(); +} + +char const* GLExtensions::getEglVendor() const { +    return mEglVendor.string(); +} + +char const* GLExtensions::getEglVersion() const { +    return mEglVersion.string(); +} + +char const* GLExtensions::getEglExtension() const { +    return mEglExtensions.string(); +} + + +// --------------------------------------------------------------------------- +}; // namespace android | 
