summaryrefslogtreecommitdiffstats
path: root/opengl/system/egl/eglDisplay.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'opengl/system/egl/eglDisplay.cpp')
-rw-r--r--opengl/system/egl/eglDisplay.cpp485
1 files changed, 0 insertions, 485 deletions
diff --git a/opengl/system/egl/eglDisplay.cpp b/opengl/system/egl/eglDisplay.cpp
deleted file mode 100644
index 9340482a..00000000
--- a/opengl/system/egl/eglDisplay.cpp
+++ /dev/null
@@ -1,485 +0,0 @@
-/*
-* Copyright (C) 2011 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 "eglDisplay.h"
-#include "HostConnection.h"
-#include <dlfcn.h>
-
-static const int systemEGLVersionMajor = 1;
-static const int systemEGLVersionMinor = 4;
-static const char systemEGLVendor[] = "Google Android emulator";
-
-// list of extensions supported by this EGL implementation
-// NOTE that each extension name should be suffixed with space
-static const char systemStaticEGLExtensions[] =
- "EGL_ANDROID_image_native_buffer "
- "EGL_KHR_fence_sync "
- "EGL_KHR_image_base "
- "EGL_KHR_gl_texture_2d_image ";
-
-static void *s_gles_lib = NULL;
-static void *s_gles2_lib = NULL;
-
-// The following function will be called when we (libEGL)
-// gets unloaded
-// At this point we want to unload the gles libraries we
-// might have loaded during initialization
-static void __attribute__ ((destructor)) do_on_unload(void)
-{
- if (s_gles_lib) {
- dlclose(s_gles_lib);
- }
-
- if (s_gles2_lib) {
- dlclose(s_gles2_lib);
- }
-}
-
-eglDisplay::eglDisplay() :
- m_initialized(false),
- m_major(0),
- m_minor(0),
- m_hostRendererVersion(0),
- m_numConfigs(0),
- m_numConfigAttribs(0),
- m_attribs(DefaultKeyedVector<EGLint, EGLint>(ATTRIBUTE_NONE)),
- m_configs(NULL),
- m_gles_iface(NULL),
- m_gles2_iface(NULL),
- m_versionString(NULL),
- m_vendorString(NULL),
- m_extensionString(NULL)
-{
- pthread_mutex_init(&m_lock, NULL);
-}
-
-eglDisplay::~eglDisplay()
-{
- pthread_mutex_destroy(&m_lock);
-}
-
-bool eglDisplay::initialize(EGLClient_eglInterface *eglIface)
-{
- pthread_mutex_lock(&m_lock);
- if (!m_initialized) {
-
- //
- // load GLES client API
- //
-#if __LP64__
- m_gles_iface = loadGLESClientAPI("/system/lib64/egl/libGLESv1_CM_emulation.so",
- eglIface,
- &s_gles_lib);
-#else
- m_gles_iface = loadGLESClientAPI("/system/lib/egl/libGLESv1_CM_emulation.so",
- eglIface,
- &s_gles_lib);
-#endif
- if (!m_gles_iface) {
- pthread_mutex_unlock(&m_lock);
- ALOGE("Failed to load gles1 iface");
- return false;
- }
-
-#ifdef WITH_GLES2
-#if __LP64__
- m_gles2_iface = loadGLESClientAPI("/system/lib64/egl/libGLESv2_emulation.so",
- eglIface,
- &s_gles2_lib);
-#else
- m_gles2_iface = loadGLESClientAPI("/system/lib/egl/libGLESv2_emulation.so",
- eglIface,
- &s_gles2_lib);
-#endif
- // Note that if loading gles2 failed, we can still run with no
- // GLES2 support, having GLES2 is not mandatory.
-#endif
-
- //
- // establish connection with the host
- //
- HostConnection *hcon = HostConnection::get();
- if (!hcon) {
- pthread_mutex_unlock(&m_lock);
- ALOGE("Failed to establish connection with the host\n");
- return false;
- }
-
- //
- // get renderControl encoder instance
- //
- renderControl_encoder_context_t *rcEnc = hcon->rcEncoder();
- if (!rcEnc) {
- pthread_mutex_unlock(&m_lock);
- ALOGE("Failed to get renderControl encoder instance");
- return false;
- }
-
- //
- // Query host reneder and EGL version
- //
- m_hostRendererVersion = rcEnc->rcGetRendererVersion(rcEnc);
- EGLint status = rcEnc->rcGetEGLVersion(rcEnc, &m_major, &m_minor);
- if (status != EGL_TRUE) {
- // host EGL initialization failed !!
- pthread_mutex_unlock(&m_lock);
- return false;
- }
-
- //
- // Take minimum version beween what we support and what the host support
- //
- if (m_major > systemEGLVersionMajor) {
- m_major = systemEGLVersionMajor;
- m_minor = systemEGLVersionMinor;
- }
- else if (m_major == systemEGLVersionMajor &&
- m_minor > systemEGLVersionMinor) {
- m_minor = systemEGLVersionMinor;
- }
-
- //
- // Query the host for the set of configs
- //
- m_numConfigs = rcEnc->rcGetNumConfigs(rcEnc, (uint32_t*)&m_numConfigAttribs);
- if (m_numConfigs <= 0 || m_numConfigAttribs <= 0) {
- // just sanity check - should never happen
- pthread_mutex_unlock(&m_lock);
- return false;
- }
-
- uint32_t nInts = m_numConfigAttribs * (m_numConfigs + 1);
- EGLint tmp_buf[nInts];
- m_configs = new EGLint[nInts-m_numConfigAttribs];
- if (!m_configs) {
- pthread_mutex_unlock(&m_lock);
- return false;
- }
-
- //EGLint n = rcEnc->rcGetConfigs(rcEnc, nInts*sizeof(EGLint), m_configs);
- EGLint n = rcEnc->rcGetConfigs(rcEnc, nInts*sizeof(EGLint), (GLuint*)tmp_buf);
- if (n != m_numConfigs) {
- pthread_mutex_unlock(&m_lock);
- return false;
- }
-
- //Fill the attributes vector.
- //The first m_numConfigAttribs values of tmp_buf are the actual attributes enums.
- for (int i=0; i<m_numConfigAttribs; i++) {
- m_attribs.add(tmp_buf[i], i);
- }
-
- //Copy the actual configs data to m_configs
- memcpy(m_configs, tmp_buf + m_numConfigAttribs, m_numConfigs*m_numConfigAttribs*sizeof(EGLint));
-
- m_initialized = true;
- }
- pthread_mutex_unlock(&m_lock);
-
- processConfigs();
-
- return true;
-}
-
-void eglDisplay::processConfigs()
-{
- for (intptr_t i=0; i<m_numConfigs; i++) {
- EGLConfig config = (EGLConfig)i;
- //Setup the EGL_NATIVE_VISUAL_ID attribute
- PixelFormat format;
- if (getConfigNativePixelFormat(config, &format)) {
- setConfigAttrib(config, EGL_NATIVE_VISUAL_ID, format);
- }
- }
-}
-
-void eglDisplay::terminate()
-{
- pthread_mutex_lock(&m_lock);
- if (m_initialized) {
- m_initialized = false;
- delete [] m_configs;
- m_configs = NULL;
-
- if (m_versionString) {
- free(m_versionString);
- m_versionString = NULL;
- }
- if (m_vendorString) {
- free(m_vendorString);
- m_vendorString = NULL;
- }
- if (m_extensionString) {
- free(m_extensionString);
- m_extensionString = NULL;
- }
- }
- pthread_mutex_unlock(&m_lock);
-}
-
-EGLClient_glesInterface *eglDisplay::loadGLESClientAPI(const char *libName,
- EGLClient_eglInterface *eglIface,
- void **libHandle)
-{
- void *lib = dlopen(libName, RTLD_NOW);
- if (!lib) {
- ALOGE("Failed to dlopen %s", libName);
- return NULL;
- }
-
- init_emul_gles_t init_gles_func = (init_emul_gles_t)dlsym(lib,"init_emul_gles");
- if (!init_gles_func) {
- ALOGE("Failed to find init_emul_gles");
- dlclose((void*)lib);
- return NULL;
- }
-
- *libHandle = lib;
- return (*init_gles_func)(eglIface);
-}
-
-static char *queryHostEGLString(EGLint name)
-{
- HostConnection *hcon = HostConnection::get();
- if (hcon) {
- renderControl_encoder_context_t *rcEnc = hcon->rcEncoder();
- if (rcEnc) {
- int n = rcEnc->rcQueryEGLString(rcEnc, name, NULL, 0);
- if (n < 0) {
- // allocate space for the string with additional
- // space charachter to be suffixed at the end.
- char *str = (char *)malloc(-n+2);
- n = rcEnc->rcQueryEGLString(rcEnc, name, str, -n);
- if (n > 0) {
- // add extra space at end of string which will be
- // needed later when filtering the extension list.
- strcat(str, " ");
- return str;
- }
-
- free(str);
- }
- }
- }
-
- return NULL;
-}
-
-static bool findExtInList(const char* token, int tokenlen, const char* list)
-{
- const char* p = list;
- while (*p != '\0') {
- const char* q = strchr(p, ' ');
- if (q == NULL) {
- /* should not happen, list must be space-terminated */
- break;
- }
- if (tokenlen == (q - p) && !memcmp(token, p, tokenlen)) {
- return true; /* found it */
- }
- p = q+1;
- }
- return false; /* not found */
-}
-
-static char *buildExtensionString()
-{
- //Query host extension string
- char *hostExt = queryHostEGLString(EGL_EXTENSIONS);
- if (!hostExt || (hostExt[1] == '\0')) {
- // no extensions on host - only static extension list supported
- return strdup(systemStaticEGLExtensions);
- }
-
- int n = strlen(hostExt);
- if (n > 0) {
- char *str;
- asprintf(&str,"%s%s", systemStaticEGLExtensions, hostExt);
- free((char*)hostExt);
- return str;
- }
- else {
- free((char*)hostExt);
- return strdup(systemStaticEGLExtensions);
- }
-}
-
-const char *eglDisplay::queryString(EGLint name)
-{
- if (name == EGL_CLIENT_APIS) {
- return "OpenGL_ES";
- }
- else if (name == EGL_VERSION) {
- pthread_mutex_lock(&m_lock);
- if (m_versionString) {
- pthread_mutex_unlock(&m_lock);
- return m_versionString;
- }
-
- // build version string
- asprintf(&m_versionString, "%d.%d", m_major, m_minor);
- pthread_mutex_unlock(&m_lock);
-
- return m_versionString;
- }
- else if (name == EGL_VENDOR) {
- pthread_mutex_lock(&m_lock);
- if (m_vendorString) {
- pthread_mutex_unlock(&m_lock);
- return m_vendorString;
- }
-
- // build vendor string
- const char *hostVendor = queryHostEGLString(EGL_VENDOR);
-
- if (hostVendor) {
- asprintf(&m_vendorString, "%s Host: %s",
- systemEGLVendor, hostVendor);
- free((char*)hostVendor);
- }
- else {
- m_vendorString = (char *)systemEGLVendor;
- }
- pthread_mutex_unlock(&m_lock);
-
- return m_vendorString;
- }
- else if (name == EGL_EXTENSIONS) {
- pthread_mutex_lock(&m_lock);
- if (m_extensionString) {
- pthread_mutex_unlock(&m_lock);
- return m_extensionString;
- }
-
- // build extension string
- m_extensionString = buildExtensionString();
- pthread_mutex_unlock(&m_lock);
-
- return m_extensionString;
- }
- else {
- ALOGE("[%s] Unknown name %d\n", __FUNCTION__, name);
- return NULL;
- }
-}
-
-/* To get the value of attribute <a> of config <c> use the following formula:
- * value = *(m_configs + (int)c*m_numConfigAttribs + a);
- */
-EGLBoolean eglDisplay::getAttribValue(EGLConfig config, EGLint attribIdx, EGLint * value)
-{
- if (attribIdx == ATTRIBUTE_NONE)
- {
- ALOGE("[%s] Bad attribute idx\n", __FUNCTION__);
- return EGL_FALSE;
- }
- *value = *(m_configs + (intptr_t)config*m_numConfigAttribs + attribIdx);
- return EGL_TRUE;
-}
-
-EGLBoolean eglDisplay::getConfigAttrib(EGLConfig config, EGLint attrib, EGLint * value)
-{
- //Though it seems that valueFor() is thread-safe, we don't take chanses
- pthread_mutex_lock(&m_lock);
- EGLBoolean ret = getAttribValue(config, m_attribs.valueFor(attrib), value);
- pthread_mutex_unlock(&m_lock);
- return ret;
-}
-
-void eglDisplay::dumpConfig(EGLConfig config)
-{
- EGLint value = 0;
- DBG("^^^^^^^^^^ dumpConfig %d ^^^^^^^^^^^^^^^^^^", (int)config);
- for (int i=0; i<m_numConfigAttribs; i++) {
- getAttribValue(config, i, &value);
- DBG("{%d}[%d] %d\n", (int)config, i, value);
- }
-}
-
-/* To set the value of attribute <a> of config <c> use the following formula:
- * *(m_configs + (int)c*m_numConfigAttribs + a) = value;
- */
-EGLBoolean eglDisplay::setAttribValue(EGLConfig config, EGLint attribIdx, EGLint value)
-{
- if (attribIdx == ATTRIBUTE_NONE)
- {
- ALOGE("[%s] Bad attribute idx\n", __FUNCTION__);
- return EGL_FALSE;
- }
- *(m_configs + (intptr_t)config*m_numConfigAttribs + attribIdx) = value;
- return EGL_TRUE;
-}
-
-EGLBoolean eglDisplay::setConfigAttrib(EGLConfig config, EGLint attrib, EGLint value)
-{
- //Though it seems that valueFor() is thread-safe, we don't take chanses
- pthread_mutex_lock(&m_lock);
- EGLBoolean ret = setAttribValue(config, m_attribs.valueFor(attrib), value);
- pthread_mutex_unlock(&m_lock);
- return ret;
-}
-
-
-EGLBoolean eglDisplay::getConfigNativePixelFormat(EGLConfig config, PixelFormat * format)
-{
- EGLint redSize, blueSize, greenSize, alphaSize;
-
- if ( !(getAttribValue(config, m_attribs.valueFor(EGL_RED_SIZE), &redSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_BLUE_SIZE), &blueSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_GREEN_SIZE), &greenSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_ALPHA_SIZE), &alphaSize)) )
- {
- ALOGE("Couldn't find value for one of the pixel format attributes");
- return EGL_FALSE;
- }
-
- //calculate the GL internal format
- if ((redSize==8)&&(greenSize==8)&&(blueSize==8)&&(alphaSize==8)) *format = PIXEL_FORMAT_RGBA_8888; //XXX: BGR?
- else if ((redSize==8)&&(greenSize==8)&&(blueSize==8)&&(alphaSize==0)) *format = PIXEL_FORMAT_RGBX_8888; //XXX or PIXEL_FORMAT_RGB_888
- else if ((redSize==5)&&(greenSize==6)&&(blueSize==5)&&(alphaSize==0)) *format = PIXEL_FORMAT_RGB_565;
- else if ((redSize==5)&&(greenSize==5)&&(blueSize==5)&&(alphaSize==1)) *format = PIXEL_FORMAT_RGBA_5551;
- else if ((redSize==4)&&(greenSize==4)&&(blueSize==4)&&(alphaSize==4)) *format = PIXEL_FORMAT_RGBA_4444;
- else {
- return EGL_FALSE;
- }
- return EGL_TRUE;
-}
-EGLBoolean eglDisplay::getConfigGLPixelFormat(EGLConfig config, GLenum * format)
-{
- EGLint redSize, blueSize, greenSize, alphaSize;
-
- if ( !(getAttribValue(config, m_attribs.valueFor(EGL_RED_SIZE), &redSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_BLUE_SIZE), &blueSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_GREEN_SIZE), &greenSize) &&
- getAttribValue(config, m_attribs.valueFor(EGL_ALPHA_SIZE), &alphaSize)) )
- {
- ALOGE("Couldn't find value for one of the pixel format attributes");
- return EGL_FALSE;
- }
-
- //calculate the GL internal format
- if ((redSize == greenSize) && (redSize == blueSize) &&
- ((redSize == 8) || (redSize == 16) || (redSize == 32)))
- {
- if (alphaSize == 0) *format = GL_RGB;
- else *format = GL_RGBA;
- }
- else if ((redSize==5)&&(greenSize==6)&&(blueSize==5)&&(alphaSize==0)) *format = GL_RGB565_OES;
- else if ((redSize==5)&&(greenSize==5)&&(blueSize==5)&&(alphaSize==1)) *format = GL_RGB5_A1_OES;
- else if ((redSize==4)&&(greenSize==4)&&(blueSize==4)&&(alphaSize==4)) *format = GL_RGBA4_OES;
- else return EGL_FALSE;
-
- return EGL_TRUE;
-}