17adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian/* 27adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** Copyright 2011, The Android Open Source Project 37adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** 47adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License"); 57adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** you may not use this file except in compliance with the License. 67adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** You may obtain a copy of the License at 77adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** 87adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** http://www.apache.org/licenses/LICENSE-2.0 97adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** 107adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** Unless required by applicable law or agreed to in writing, software 117adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS, 127adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 137adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** See the License for the specific language governing permissions and 147adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian ** limitations under the License. 157adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian */ 167adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 178ec2ff65da037da14fa1fe372a24a053d198fc51Mathias Agopian#include <stdlib.h> 187adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian#include <pthread.h> 197adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 207adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian#include <cutils/log.h> 218ec2ff65da037da14fa1fe372a24a053d198fc51Mathias Agopian#include <cutils/properties.h> 228ec2ff65da037da14fa1fe372a24a053d198fc51Mathias Agopian 238ec2ff65da037da14fa1fe372a24a053d198fc51Mathias Agopian#include <utils/CallStack.h> 247adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 257adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian#include <EGL/egl.h> 267adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 277adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian#include "egl_tls.h" 287adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 297adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 307adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopiannamespace android { 317adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 327adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianpthread_key_t egl_tls_t::sKey = -1; 337adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianpthread_mutex_t egl_tls_t::sLockKey = PTHREAD_MUTEX_INITIALIZER; 347adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 357adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianegl_tls_t::egl_tls_t() 367adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian : error(EGL_SUCCESS), ctx(0), logCallWithNoContext(EGL_TRUE), dbg(0) { 377adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 387adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 397adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianconst char *egl_tls_t::egl_strerror(EGLint err) { 407adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian switch (err) { 417adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_SUCCESS: return "EGL_SUCCESS"; 427adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_NOT_INITIALIZED: return "EGL_NOT_INITIALIZED"; 437adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_ACCESS: return "EGL_BAD_ACCESS"; 447adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_ALLOC: return "EGL_BAD_ALLOC"; 457adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_ATTRIBUTE: return "EGL_BAD_ATTRIBUTE"; 467adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_CONFIG: return "EGL_BAD_CONFIG"; 477adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_CONTEXT: return "EGL_BAD_CONTEXT"; 487adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_CURRENT_SURFACE: return "EGL_BAD_CURRENT_SURFACE"; 497adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_DISPLAY: return "EGL_BAD_DISPLAY"; 507adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_MATCH: return "EGL_BAD_MATCH"; 517adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_NATIVE_PIXMAP: return "EGL_BAD_NATIVE_PIXMAP"; 527adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_NATIVE_WINDOW: return "EGL_BAD_NATIVE_WINDOW"; 537adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_PARAMETER: return "EGL_BAD_PARAMETER"; 547adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_BAD_SURFACE: return "EGL_BAD_SURFACE"; 557adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian case EGL_CONTEXT_LOST: return "EGL_CONTEXT_LOST"; 567adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian default: return "UNKNOWN"; 577adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 587adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 597adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 607adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianvoid egl_tls_t::validateTLSKey() 617adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian{ 627adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (sKey == -1) { 637adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian pthread_mutex_lock(&sLockKey); 647adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (sKey == -1) 657adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian pthread_key_create(&sKey, NULL); 667adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian pthread_mutex_unlock(&sLockKey); 677adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 687adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 697adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 7097bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopianvoid egl_tls_t::setErrorEtcImpl( 7197bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian const char* caller, int line, EGLint error, bool quiet) { 727adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian validateTLSKey(); 737adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = getTLS(); 747adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (tls->error != error) { 7597bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian if (!quiet) { 7697bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian LOGE("%s:%d error %x (%s)", 7797bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian caller, line, error, egl_strerror(error)); 7897bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian char value[PROPERTY_VALUE_MAX]; 7997bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian property_get("debug.egl.callstack", value, "0"); 8097bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian if (atoi(value)) { 8197bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian CallStack stack; 8297bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian stack.update(); 8397bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian stack.dump(); 8497bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian } 858ec2ff65da037da14fa1fe372a24a053d198fc51Mathias Agopian } 8697bc75d42c2a03a68c46c134f16fd64d8f2ce657Mathias Agopian tls->error = error; 877adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 887adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 897adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 907adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianbool egl_tls_t::logNoContextCall() { 917adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = getTLS(); 927adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (tls->logCallWithNoContext == true) { 937adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian tls->logCallWithNoContext = false; 947adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return true; 957adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 967adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return false; 977adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 987adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 997adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianegl_tls_t* egl_tls_t::getTLS() { 1007adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey); 1017adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (tls == 0) { 1027adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian tls = new egl_tls_t; 1037adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian pthread_setspecific(sKey, tls); 1047adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 1057adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return tls; 1067adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1077adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1087adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianvoid egl_tls_t::clearTLS() { 1097adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (sKey != -1) { 1107adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey); 1117adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (tls) { 1127adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian delete tls; 1137adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian pthread_setspecific(sKey, 0); 1147adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 1157adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian } 1167adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1177adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1187adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianvoid egl_tls_t::clearError() { 1197adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian // This must clear the error from all the underlying EGL implementations as 1207adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian // well as the EGL wrapper layer. 1217adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian eglGetError(); 1227adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1237adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1247adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias AgopianEGLint egl_tls_t::getError() { 1257adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (sKey == -1) 1267adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return EGL_SUCCESS; 1277adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = (egl_tls_t*)pthread_getspecific(sKey); 1287adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (!tls) return EGL_SUCCESS; 1297adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian EGLint error = tls->error; 1307adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian tls->error = EGL_SUCCESS; 1317adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return error; 1327adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1337adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1347adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopianvoid egl_tls_t::setContext(EGLContext ctx) { 1357adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian validateTLSKey(); 1367adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian getTLS()->ctx = ctx; 1377adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1387adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1397adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias AgopianEGLContext egl_tls_t::getContext() { 1407adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (sKey == -1) 1417adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return EGL_NO_CONTEXT; 1427adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian egl_tls_t* tls = (egl_tls_t *)pthread_getspecific(sKey); 1437adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian if (!tls) return EGL_NO_CONTEXT; 1447adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian return tls->ctx; 1457adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} 1467adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1477adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian 1487adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7cMathias Agopian} // namespace android 149