19d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian/*
29d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** Copyright 2009, The Android Open Source Project
39d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian **
49d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
59d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** you may not use this file except in compliance with the License.
69d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** You may obtain a copy of the License at
79d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian **
89d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
99d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian **
109d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** Unless required by applicable law or agreed to in writing, software
119d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
129d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
139d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** See the License for the specific language governing permissions and
149d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian ** limitations under the License.
159d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian */
169d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
179d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#ifndef ANDROID_EGL_LOADER_H
189d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#define ANDROID_EGL_LOADER_H
199d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
209d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <ctype.h>
219d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <string.h>
229d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <errno.h>
239d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
249d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <utils/Errors.h>
259d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <utils/Singleton.h>
269d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <utils/String8.h>
279d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <utils/Vector.h>
289d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
299d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#include <EGL/egl.h>
309d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
319d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian// ----------------------------------------------------------------------------
329d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopiannamespace android {
339d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian// ----------------------------------------------------------------------------
349d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
356fc569971faa342b2e2da46c55fbfbba3a2a7814Mathias Agopianstruct egl_connection_t;
369d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
379d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopianclass Loader : public Singleton<Loader>
389d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian{
399d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    friend class Singleton<Loader>;
409d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
419d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    typedef __eglMustCastToProperFunctionPointerType (*getProcAddressType)(
429d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian            const char*);
439d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
449d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    enum {
459d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        EGL         = 0x01,
469d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        GLESv1_CM   = 0x02,
479d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        GLESv2      = 0x04
489d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    };
499d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    struct driver_t {
509d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        driver_t(void* gles);
519d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        ~driver_t();
529d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        status_t set(void* hnd, int32_t api);
539d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        void* dso[3];
549d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    };
559d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
569d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    struct entry_t {
579d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        entry_t() { }
589d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        entry_t(int dpy, int impl, const char* tag);
599d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        int dpy;
609d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        int impl;
619d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian        String8 tag;
629d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    };
639d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
649d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    Vector<entry_t> gConfig;
659d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    getProcAddressType getProcAddress;
669d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
679d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    const char* getTag(int dpy, int impl);
689d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
699d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopianpublic:
709d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    ~Loader();
719d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
726fc569971faa342b2e2da46c55fbfbba3a2a7814Mathias Agopian    void* open(EGLNativeDisplayType display, int impl, egl_connection_t* cnx);
739d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    status_t close(void* driver);
749d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
759d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopianprivate:
769d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    Loader();
77a21c2009f1deceef0fd22a4134e35040a13fb039Brian Swetland    void *load_driver(const char* kind, const char *tag, egl_connection_t* cnx, uint32_t mask);
789d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
799d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    static __attribute__((noinline))
809d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian    void init_api(void* dso,
819d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian            char const * const * api,
829d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian            __eglMustCastToProperFunctionPointerType* curr,
839d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian            getProcAddressType getProcAddress);
849d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian};
859d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
869d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian// ----------------------------------------------------------------------------
879d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian}; // namespace android
889d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian// ----------------------------------------------------------------------------
899d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian
909d17c057bdb9da5fa991a2c3efebe453106ca0a7Mathias Agopian#endif /* ANDROID_EGL_LOADER_H */
91