1 /*
2  ** Copyright 2009, 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_LOADER_H
18 #define ANDROID_EGL_LOADER_H
19 
20 #include <ctype.h>
21 #include <string.h>
22 #include <errno.h>
23 
24 #include <utils/Errors.h>
25 #include <utils/Singleton.h>
26 #include <utils/String8.h>
27 
28 #include <EGL/egl.h>
29 
30 // ----------------------------------------------------------------------------
31 namespace android {
32 // ----------------------------------------------------------------------------
33 
34 struct egl_connection_t;
35 
36 class Loader : public Singleton<Loader>
37 {
38     friend class Singleton<Loader>;
39 
40     typedef __eglMustCastToProperFunctionPointerType (*getProcAddressType)(
41             const char*);
42 
43     enum {
44         EGL         = 0x01,
45         GLESv1_CM   = 0x02,
46         GLESv2      = 0x04
47     };
48     struct driver_t {
49         driver_t(void* gles);
50         ~driver_t();
51         status_t set(void* hnd, int32_t api);
52         void* dso[3];
53     };
54 
55     getProcAddressType getProcAddress;
56 
57 public:
58     ~Loader();
59 
60     void* open(egl_connection_t* cnx);
61     status_t close(void* driver);
62 
63 private:
64     Loader();
65     void *load_driver(const char* kind, egl_connection_t* cnx, uint32_t mask);
66 
67     static __attribute__((noinline))
68     void init_api(void* dso,
69             char const * const * api,
70             __eglMustCastToProperFunctionPointerType* curr,
71             getProcAddressType getProcAddress);
72 };
73 
74 // ----------------------------------------------------------------------------
75 }; // namespace android
76 // ----------------------------------------------------------------------------
77 
78 #endif /* ANDROID_EGL_LOADER_H */
79