1de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian/*
2de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** Copyright 2009, The Android Open Source Project
3de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian **
4de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
5de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** you may not use this file except in compliance with the License.
6de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** You may obtain a copy of the License at
7de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian **
8de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
9de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian **
10de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** Unless required by applicable law or agreed to in writing, software
11de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
12de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** See the License for the specific language governing permissions and
14de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian ** limitations under the License.
15de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian */
16de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
17de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#ifndef ANDROID_EGL_LOADER_H
18de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#define ANDROID_EGL_LOADER_H
19de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
20de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <ctype.h>
21de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <string.h>
22de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <errno.h>
23de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
24de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <utils/Errors.h>
25de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <utils/Singleton.h>
26de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <utils/String8.h>
27de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
28de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <EGL/egl.h>
29de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
30de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
31de58697644a52a614ad9498aa087e95d4a223673Mathias Agopiannamespace android {
32de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
33de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
34618fa10949c42eb83fa5fe105fe542bcff833ddaMathias Agopianstruct egl_connection_t;
35de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
36de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianclass Loader : public Singleton<Loader>
37de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian{
38de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    friend class Singleton<Loader>;
39de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
40de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    typedef __eglMustCastToProperFunctionPointerType (*getProcAddressType)(
41de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            const char*);
42de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
43de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    enum {
44de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        EGL         = 0x01,
45de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        GLESv1_CM   = 0x02,
46de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        GLESv2      = 0x04
47de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    };
48de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    struct driver_t {
49de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        driver_t(void* gles);
50de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        ~driver_t();
51de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        status_t set(void* hnd, int32_t api);
52de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        void* dso[3];
53de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    };
54de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
55de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    getProcAddressType getProcAddress;
56de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
57de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianpublic:
58de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    ~Loader();
59de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
60ada798b7ca7cabc255aa159964b64975e7fdb2dfMathias Agopian    void* open(egl_connection_t* cnx);
61de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    status_t close(void* driver);
62de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
63de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianprivate:
64de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    Loader();
65993814255fc248454368ed9fe34b4703a05eaf99Mathias Agopian    void *load_driver(const char* kind, egl_connection_t* cnx, uint32_t mask);
66de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
67de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    static __attribute__((noinline))
68de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    void init_api(void* dso,
69de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            char const * const * api,
70de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            __eglMustCastToProperFunctionPointerType* curr,
71de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            getProcAddressType getProcAddress);
72de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian};
73de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
74de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
75de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian}; // namespace android
76de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
77de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
78de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#endif /* ANDROID_EGL_LOADER_H */
79