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