PageRenderTime 91ms CodeModel.GetById 45ms app.highlight 31ms RepoModel.GetById 1ms app.codeStats 0ms

/opengl/libs/EGL/egl_tls.cpp

http://github.com/CyanogenMod/android_frameworks_base
C++ | 148 lines | 110 code | 21 blank | 17 comment | 22 complexity | 42938ad67b859a729e627079504c3c7a MD5 | raw file
Possible License(s): LGPL-2.1, MPL-2.0-no-copyleft-exception, CC0-1.0, BitTorrent-1.0, BSD-3-Clause
  1/*
  2 ** Copyright 2011, The Android Open Source Project
  3 **
  4 ** Licensed under the Apache License, Version 2.0 (the "License");
  5 ** you may not use this file except in compliance with the License.
  6 ** You may obtain a copy of the License at
  7 **
  8 **     http://www.apache.org/licenses/LICENSE-2.0
  9 **
 10 ** Unless required by applicable law or agreed to in writing, software
 11 ** distributed under the License is distributed on an "AS IS" BASIS,
 12 ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 13 ** See the License for the specific language governing permissions and
 14 ** limitations under the License.
 15 */
 16
 17#include <stdlib.h>
 18#include <pthread.h>
 19
 20#include <cutils/log.h>
 21#include <cutils/properties.h>
 22
 23#include <utils/CallStack.h>
 24
 25#include <EGL/egl.h>
 26
 27#include "egl_tls.h"
 28
 29
 30namespace android {
 31
 32pthread_key_t egl_tls_t::sKey = -1;
 33pthread_mutex_t egl_tls_t::sLockKey = PTHREAD_MUTEX_INITIALIZER;
 34
 35egl_tls_t::egl_tls_t()
 36    : error(EGL_SUCCESS), ctx(0), logCallWithNoContext(EGL_TRUE), dbg(0) {
 37}
 38
 39const char *egl_tls_t::egl_strerror(EGLint err) {
 40    switch (err) {
 41        case EGL_SUCCESS:               return "EGL_SUCCESS";
 42        case EGL_NOT_INITIALIZED:       return "EGL_NOT_INITIALIZED";
 43        case EGL_BAD_ACCESS:            return "EGL_BAD_ACCESS";
 44        case EGL_BAD_ALLOC:             return "EGL_BAD_ALLOC";
 45        case EGL_BAD_ATTRIBUTE:         return "EGL_BAD_ATTRIBUTE";
 46        case EGL_BAD_CONFIG:            return "EGL_BAD_CONFIG";
 47        case EGL_BAD_CONTEXT:           return "EGL_BAD_CONTEXT";
 48        case EGL_BAD_CURRENT_SURFACE:   return "EGL_BAD_CURRENT_SURFACE";
 49        case EGL_BAD_DISPLAY:           return "EGL_BAD_DISPLAY";
 50        case EGL_BAD_MATCH:             return "EGL_BAD_MATCH";
 51        case EGL_BAD_NATIVE_PIXMAP:     return "EGL_BAD_NATIVE_PIXMAP";
 52        case EGL_BAD_NATIVE_WINDOW:     return "EGL_BAD_NATIVE_WINDOW";
 53        case EGL_BAD_PARAMETER:         return "EGL_BAD_PARAMETER";
 54        case EGL_BAD_SURFACE:           return "EGL_BAD_SURFACE";
 55        case EGL_CONTEXT_LOST:          return "EGL_CONTEXT_LOST";
 56        default: return "UNKNOWN";
 57    }
 58}
 59
 60void egl_tls_t::validateTLSKey()
 61{
 62    if (sKey == -1) {
 63        pthread_mutex_lock(&sLockKey);
 64        if (sKey == -1)
 65            pthread_key_create(&sKey, NULL);
 66        pthread_mutex_unlock(&sLockKey);
 67    }
 68}
 69
 70void egl_tls_t::setErrorEtcImpl(
 71        const char* caller, int line, EGLint error, bool quiet) {
 72    validateTLSKey();
 73    egl_tls_t* tls = getTLS();
 74    if (tls->error != error) {
 75        if (!quiet) {
 76            LOGE("%s:%d error %x (%s)",
 77                    caller, line, error, egl_strerror(error));
 78            char value[PROPERTY_VALUE_MAX];
 79            property_get("debug.egl.callstack", value, "0");
 80            if (atoi(value)) {
 81                CallStack stack;
 82                stack.update();
 83                stack.dump();
 84            }
 85        }
 86        tls->error = error;
 87    }
 88}
 89
 90bool egl_tls_t::logNoContextCall() {
 91    egl_tls_t* tls = getTLS();
 92    if (tls->logCallWithNoContext == true) {
 93        tls->logCallWithNoContext = false;
 94        return true;
 95    }
 96    return false;
 97}
 98
 99egl_tls_t* egl_tls_t::getTLS() {
100    egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
101    if (tls == 0) {
102        tls = new egl_tls_t;
103        pthread_setspecific(sKey, tls);
104    }
105    return tls;
106}
107
108void egl_tls_t::clearTLS() {
109    if (sKey != -1) {
110        egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
111        if (tls) {
112            delete tls;
113            pthread_setspecific(sKey, 0);
114        }
115    }
116}
117
118void egl_tls_t::clearError() {
119    // This must clear the error from all the underlying EGL implementations as
120    // well as the EGL wrapper layer.
121    eglGetError();
122}
123
124EGLint egl_tls_t::getError() {
125    if (sKey == -1)
126        return EGL_SUCCESS;
127    egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey);
128    if (!tls) return EGL_SUCCESS;
129    EGLint error = tls->error;
130    tls->error = EGL_SUCCESS;
131    return error;
132}
133
134void egl_tls_t::setContext(EGLContext ctx) {
135    validateTLSKey();
136    getTLS()->ctx = ctx;
137}
138
139EGLContext egl_tls_t::getContext() {
140    if (sKey == -1)
141        return EGL_NO_CONTEXT;
142    egl_tls_t* tls = (egl_tls_t *)pthread_getspecific(sKey);
143    if (!tls) return EGL_NO_CONTEXT;
144    return tls->ctx;
145}
146
147
148} // namespace android