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#ifndef ANDROID_EGL_TLS_H
18#define ANDROID_EGL_TLS_H
19
20#include <EGL/egl.h>
21
22#include <pthread.h>
23
24// ----------------------------------------------------------------------------
25namespace android {
26// ----------------------------------------------------------------------------
27
28class DbgContext;
29
30class egl_tls_t {
31    enum { TLS_KEY_NOT_INITIALIZED = -1 };
32    static pthread_key_t sKey;
33    static pthread_once_t sOnceKey;
34
35    EGLint      error;
36    EGLContext  ctx;
37    bool        logCallWithNoContext;
38
39    egl_tls_t();
40    static void validateTLSKey();
41    static void setErrorEtcImpl(
42            const char* caller, int line, EGLint error, bool quiet);
43
44public:
45    static egl_tls_t* getTLS();
46    static void clearTLS();
47    static void clearError();
48    static EGLint getError();
49    static void setContext(EGLContext ctx);
50    static EGLContext getContext();
51    static bool logNoContextCall();
52    static const char *egl_strerror(EGLint err);
53
54    template<typename T>
55    static T setErrorEtc(const char* caller,
56            int line, EGLint error, T returnValue, bool quiet = false) {
57        setErrorEtcImpl(caller, line, error, quiet);
58        return returnValue;
59    }
60};
61
62#define setError(_e, _r)        \
63    egl_tls_t::setErrorEtc(__FUNCTION__, __LINE__, _e, _r)
64
65#define setErrorQuiet(_e, _r)   \
66    egl_tls_t::setErrorEtc(__FUNCTION__, __LINE__, _e, _r, true)
67
68// ----------------------------------------------------------------------------
69}; // namespace android
70// ----------------------------------------------------------------------------
71
72#endif // ANDROID_EGL_TLS_H
73