Loader.h revision de58697644a52a614ad9498aa087e95d4a223673
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#include <utils/Vector.h>
28de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
29de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#include <EGL/egl.h>
30de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
31de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
32de58697644a52a614ad9498aa087e95d4a223673Mathias Agopiannamespace android {
33de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
34de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
35de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianstruct gl_hooks_t;
36de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
37de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianclass Loader : public Singleton<Loader>
38de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian{
39de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    friend class Singleton<Loader>;
40de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
41de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    typedef __eglMustCastToProperFunctionPointerType (*getProcAddressType)(
42de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            const char*);
43de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
44de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    enum {
45de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        EGL         = 0x01,
46de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        GLESv1_CM   = 0x02,
47de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        GLESv2      = 0x04
48de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    };
49de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    struct driver_t {
50de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        driver_t(void* gles);
51de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        ~driver_t();
52de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        status_t set(void* hnd, int32_t api);
53de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        void* dso[3];
54de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    };
55de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
56de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    struct entry_t {
57de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        entry_t() { }
58de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        entry_t(int dpy, int impl, const char* tag);
59de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        int dpy;
60de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        int impl;
61de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian        String8 tag;
62de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    };
63de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
64de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    Vector<entry_t> gConfig;
65de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    getProcAddressType getProcAddress;
66de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
67de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    const char* getTag(int dpy, int impl);
68de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
69de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianpublic:
70de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    ~Loader();
71de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
72de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    void* open(EGLNativeDisplayType display, int impl, gl_hooks_t* hooks);
73de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    status_t close(void* driver);
74de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
75de58697644a52a614ad9498aa087e95d4a223673Mathias Agopianprivate:
76de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    Loader();
77de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    void *load_driver(const char* driver, gl_hooks_t* hooks, uint32_t mask);
78de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
79de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    static __attribute__((noinline))
80de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian    void init_api(void* dso,
81de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            char const * const * api,
82de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            __eglMustCastToProperFunctionPointerType* curr,
83de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian            getProcAddressType getProcAddress);
84de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian};
85de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
86de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
87de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian}; // namespace android
88de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian// ----------------------------------------------------------------------------
89de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian
90de58697644a52a614ad9498aa087e95d4a223673Mathias Agopian#endif /* ANDROID_EGL_LOADER_H */
91