1518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian/*
2518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Copyright 2011, The Android Open Source Project
3518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
4518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
5518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** you may not use this file except in compliance with the License.
6518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** You may obtain a copy of the License at
7518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
8518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
9518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
10518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Unless required by applicable law or agreed to in writing, software
11518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
12518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** See the License for the specific language governing permissions and
14518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** limitations under the License.
15518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian */
16518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
17518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#ifndef ANDROID_EGL_TLS_H
18518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#define ANDROID_EGL_TLS_H
19518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
20518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <pthread.h>
21518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
22518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/egl.h>
23518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
241cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#include "egldefs.h"
251cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian
261cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian// ----------------------------------------------------------------------------
27518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiannamespace android {
281cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian// ----------------------------------------------------------------------------
29518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
30518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass DbgContext;
31518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
32518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_tls_t {
334e620ddce344e946ced992f61a69c367ff92fe24Mathias Agopian    enum { TLS_KEY_NOT_INITIALIZED = -1 };
34518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static pthread_key_t sKey;
354e620ddce344e946ced992f61a69c367ff92fe24Mathias Agopian    static pthread_once_t sOnceKey;
36518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
37518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLint      error;
38518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext  ctx;
39518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLBoolean  logCallWithNoContext;
40518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
41518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_tls_t();
42518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static void validateTLSKey();
430e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian    static void setErrorEtcImpl(
440e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian            const char* caller, int line, EGLint error, bool quiet);
45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
46518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
47518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static egl_tls_t* getTLS();
48518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static void clearTLS();
49518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static void clearError();
50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static EGLint getError();
51518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static void setContext(EGLContext ctx);
52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static EGLContext getContext();
53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static bool logNoContextCall();
54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static const char *egl_strerror(EGLint err);
55518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    template<typename T>
57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    static T setErrorEtc(const char* caller,
580e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian            int line, EGLint error, T returnValue, bool quiet = false) {
590e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian        setErrorEtcImpl(caller, line, error, quiet);
60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        return returnValue;
61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
63518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
640e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian#define setError(_e, _r)        \
650e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian    egl_tls_t::setErrorEtc(__FUNCTION__, __LINE__, _e, _r)
660e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian
670e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian#define setErrorQuiet(_e, _r)   \
680e8bbee5775d81c7bbc479b995496cac9238559fMathias Agopian    egl_tls_t::setErrorEtc(__FUNCTION__, __LINE__, _e, _r, true)
69518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
701cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian// ----------------------------------------------------------------------------
711cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian
721cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#if EGL_TRACE
731cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian
741cadb25da1ed875bdd078270e642966724a0c39aMathias Agopianextern gl_hooks_t const* getGLTraceThreadSpecific();
751cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian
761cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian#endif
771cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian
781cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian// ----------------------------------------------------------------------------
79518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; // namespace android
801cadb25da1ed875bdd078270e642966724a0c39aMathias Agopian// ----------------------------------------------------------------------------
81518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
82518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif // ANDROID_EGL_TLS_H
83