egl_object.h revision e6f43ddce78d6846af12550ff9193c5c6fe5844b
1518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian/*
2518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Copyright 2007, The Android Open Source Project
3518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
4518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Licensed under the Apache License, Version 2.0 (the "License");
5518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** you may not use this file except in compliance with the License.
6518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** You may obtain a copy of the License at
7518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
8518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **     http://www.apache.org/licenses/LICENSE-2.0
9518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian **
10518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** Unless required by applicable law or agreed to in writing, software
11518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** distributed under the License is distributed on an "AS IS" BASIS,
12518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** See the License for the specific language governing permissions and
14518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian ** limitations under the License.
15518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian */
16518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
17518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#ifndef ANDROID_EGL_OBJECT_H
18518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#define ANDROID_EGL_OBJECT_H
19518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
20518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
21518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <ctype.h>
22518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdint.h>
23518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <stdlib.h>
24518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
25518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/egl.h>
26518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <EGL/eglext.h>
27518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/gl.h>
28518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <GLES/glext.h>
29518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
30518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <utils/threads.h>
31518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
32518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include <system/window.h>
33518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
34518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#include "egl_display.h"
35518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
36518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
37518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiannamespace android {
38518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
39518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
40518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_display_t;
41518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
42518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianclass egl_object_t {
43518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_display_t *display;
44518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    mutable volatile int32_t count;
45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
465b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianprotected:
475b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    virtual ~egl_object_t();
485b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
49518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_object_t(egl_display_t* display);
515b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    void destroy();
52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    inline int32_t incRef() { return android_atomic_inc(&count); }
54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    inline int32_t decRef() { return android_atomic_dec(&count); }
55f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian    inline egl_display_t* getDisplay() const { return display; }
56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate:
585b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    void terminate();
59f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian    static bool get(egl_display_t const* display, egl_object_t* object);
60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    template <typename N, typename T>
635b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    class LocalRef {
645b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        egl_object_t* ref;
655b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        LocalRef();
665b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        LocalRef(const LocalRef* rhs);
675b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    public:
685b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ~LocalRef();
695b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        explicit LocalRef(egl_object_t* rhs);
70f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian        explicit LocalRef(egl_display_t const* display, T o) : ref(0) {
715b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian            egl_object_t* native = reinterpret_cast<N*>(o);
72f0480de37492597a5c5cf1e6f8346f1467e3a552Mathias Agopian            if (o && egl_object_t::get(display, native)) {
73518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                ref = native;
74518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
75518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
76518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        inline N* get() {
775b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian            return static_cast<N*>(ref);
78518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
795b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        void acquire() const;
805b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        void release() const;
815b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        void terminate();
82518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
835b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    template <typename N, typename T>
845b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    friend class LocalRef;
85518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
86518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
875b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopiantemplate<typename N, typename T>
885b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianegl_object_t::LocalRef<N, T>::LocalRef(egl_object_t* rhs) : ref(rhs) {
895b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    if (ref) {
905b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ref->incRef();
915b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    }
925b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian}
935b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
945b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopiantemplate <typename N, typename T>
955b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianegl_object_t::LocalRef<N,T>::~LocalRef() {
965b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    if (ref) {
975b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ref->destroy();
985b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    }
995b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian}
1005b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
1015b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopiantemplate <typename N, typename T>
1025b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianvoid egl_object_t::LocalRef<N,T>::acquire() const {
1035b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    if (ref) {
1045b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ref->incRef();
1055b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    }
1065b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian}
1075b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
1085b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopiantemplate <typename N, typename T>
1095b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianvoid egl_object_t::LocalRef<N,T>::release() const {
1105b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    if (ref) {
1115b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        if (ref->decRef() == 1) {
1125b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian            // shouldn't happen because this is called from LocalRef
113e6f43ddce78d6846af12550ff9193c5c6fe5844bSteve Block            ALOGE("LocalRef::release() removed the last reference!");
1145b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        }
1155b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    }
1165b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian}
1175b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
1185b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopiantemplate <typename N, typename T>
1195b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianvoid egl_object_t::LocalRef<N,T>::terminate() {
1205b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    if (ref) {
1215b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian        ref->terminate();
1225b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    }
1235b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian}
1245b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian
125518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
126518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
1275b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianclass egl_surface_t: public egl_object_t {
1285b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianprotected:
1299f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis    ~egl_surface_t() {
1309f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis        ANativeWindow* const window = win.get();
1319f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis        if (window != NULL) {
1329f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis            native_window_set_buffers_format(window, 0);
1339f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis            if (native_window_api_disconnect(window, NATIVE_WINDOW_API_EGL)) {
13432397c1cd3327905173b36baa6fd1c579bc328ffSteve Block                ALOGW("EGLNativeWindowType %p disconnect failed", window);
1359f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis            }
1369f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis        }
1379f24fd020e387d57cb05d58f26985baa44571b85Jamie Gennis    }
1385b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianpublic:
139518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
140518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
141518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
142518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            EGLSurface surface, int impl, egl_connection_t const* cnx) :
143518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), surface(surface),
144518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                config(config), win(win), impl(impl), cnx(cnx) {
145518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
146518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
147518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface surface;
148518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLConfig config;
149518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    sp<ANativeWindow> win;
150518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int impl;
151518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_connection_t const* cnx;
152518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
153518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
1545b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianclass egl_context_t: public egl_object_t {
1555b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianprotected:
1565b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    ~egl_context_t() {}
1575b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianpublic:
158518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
159518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
160518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
161518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            int impl, egl_connection_t const* cnx, int version) :
162518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context),
163518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                config(config), read(0), draw(0), impl(impl), cnx(cnx),
164518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                version(version) {
165518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
166518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
167518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
168518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLConfig config;
169518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface read;
170518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface draw;
171518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int impl;
172518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_connection_t const* cnx;
173518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int version;
174518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
175518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
1765b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianclass egl_image_t: public egl_object_t {
1775b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianprotected:
1785b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    ~egl_image_t() {}
1795b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianpublic:
180518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_image_t, EGLImageKHR> Ref;
181518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
182518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_image_t(EGLDisplay dpy, EGLContext context) :
183518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context) {
184518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        memset(images, 0, sizeof(images));
185518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
186518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
187518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
188518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLImageKHR images[IMPL_NUM_IMPLEMENTATIONS];
189518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
190518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
1915b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianclass egl_sync_t: public egl_object_t {
1925b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianprotected:
1935b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopian    ~egl_sync_t() {}
1945b287a6ea8dfac7ab3e03ae1e98f9e2214cbae09Mathias Agopianpublic:
195518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_sync_t, EGLSyncKHR> Ref;
196518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
197518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_sync_t(EGLDisplay dpy, EGLContext context, EGLSyncKHR sync) :
198518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context), sync(sync) {
199518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
200518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
201518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
202518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSyncKHR sync;
203518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
204518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
205518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
206518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
207518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_surface_t::Ref  SurfaceRef;
208518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_context_t::Ref  ContextRef;
209518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_image_t::Ref    ImageRef;
210518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_sync_t::Ref     SyncRef;
211518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
212518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
213518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
214518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantemplate<typename NATIVE, typename EGL>
215518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline NATIVE* egl_to_native_cast(EGL arg) {
216518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return reinterpret_cast<NATIVE*>(arg);
217518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
218518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
219518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
220518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_surface_t* get_surface(EGLSurface surface) {
221518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_surface_t>(surface);
222518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
223518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
224518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
225518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_context_t* get_context(EGLContext context) {
226518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_context_t>(context);
227518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
228518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
229518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
230518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_image_t* get_image(EGLImageKHR image) {
231518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_image_t>(image);
232518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
233518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
234518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
235518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_sync_t* get_sync(EGLSyncKHR sync) {
236518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_sync_t>(sync);
237518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
238518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
239518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
240518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; // namespace android
241518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
242518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
243518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif // ANDROID_EGL_OBJECT_H
244