egl_object.h revision 518ec112f468eb67bf681b3eec896d7bfb4ff98d
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    volatile int32_t  terminated;
45518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    mutable volatile int32_t count;
46518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
47518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
48518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_object_t(egl_display_t* display);
49518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
50518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    inline bool isAlive() const { return !terminated; }
51518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    inline int32_t incRef() { return android_atomic_inc(&count); }
52518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    inline int32_t decRef() { return android_atomic_dec(&count); }
53518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
54518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianprivate:
55518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    bool get();
56518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    bool put();
57518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
58518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianpublic:
59518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    template <typename N, typename T>
60518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    struct LocalRef {
61518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        N* ref;
62518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        LocalRef(T o) : ref(0) {
63518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            N* native = reinterpret_cast<N*>(o);
64518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            if (o && native->get()) {
65518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                ref = native;
66518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
67518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
68518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        ~LocalRef() {
69518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            if (ref && ref->put()) {
70518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                delete ref;
71518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
72518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
73518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        inline N* get() {
74518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            return ref;
75518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
76518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        void acquire() const {
77518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            if (ref) {
78518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                android_atomic_inc(&ref->count);
79518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
80518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
81518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        void release() const {
82518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            if (ref) {
83518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                int32_t c = android_atomic_dec(&ref->count);
84518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                // ref->count cannot be 1 prior atomic_dec because we have
85518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                // a reference, and if we have one, it means there was
86518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                // already one before us.
87518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                LOGE_IF(c==1, "refcount is now 0 in release()");
88518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
89518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
90518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        void terminate() {
91518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            if (ref) {
92518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                ref->terminated = 1;
93518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                release();
94518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            }
95518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        }
96518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    };
97518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
98518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
99518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
100518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
101518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_surface_t: public egl_object_t {
102518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
103518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
104518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
105518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            EGLSurface surface, int impl, egl_connection_t const* cnx) :
106518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), surface(surface),
107518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                config(config), win(win), impl(impl), cnx(cnx) {
108518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
109518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    ~egl_surface_t() {
110518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
111518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
112518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface surface;
113518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLConfig config;
114518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    sp<ANativeWindow> win;
115518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int impl;
116518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_connection_t const* cnx;
117518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
118518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
119518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_context_t: public egl_object_t {
120518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
121518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
122518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
123518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian            int impl, egl_connection_t const* cnx, int version) :
124518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context),
125518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                config(config), read(0), draw(0), impl(impl), cnx(cnx),
126518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian                version(version) {
127518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
128518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    ~egl_context_t() {
129518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
130518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
131518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
132518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLConfig config;
133518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface read;
134518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSurface draw;
135518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int impl;
136518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_connection_t const* cnx;
137518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    int version;
138518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
139518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
140518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_image_t: public egl_object_t {
141518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_image_t, EGLImageKHR> Ref;
142518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
143518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_image_t(EGLDisplay dpy, EGLContext context) :
144518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context) {
145518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        memset(images, 0, sizeof(images));
146518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
147518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
148518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
149518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLImageKHR images[IMPL_NUM_IMPLEMENTATIONS];
150518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
151518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
152518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstruct egl_sync_t: public egl_object_t {
153518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    typedef egl_object_t::LocalRef<egl_sync_t, EGLSyncKHR> Ref;
154518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
155518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    egl_sync_t(EGLDisplay dpy, EGLContext context, EGLSyncKHR sync) :
156518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian        egl_object_t(get_display(dpy)), dpy(dpy), context(context), sync(sync) {
157518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    }
158518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLDisplay dpy;
159518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLContext context;
160518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    EGLSyncKHR sync;
161518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian};
162518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
163518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
164518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
165518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_surface_t::Ref  SurfaceRef;
166518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_context_t::Ref  ContextRef;
167518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_image_t::Ref    ImageRef;
168518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantypedef egl_sync_t::Ref     SyncRef;
169518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
170518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
171518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
172518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopiantemplate<typename NATIVE, typename EGL>
173518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline NATIVE* egl_to_native_cast(EGL arg) {
174518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return reinterpret_cast<NATIVE*>(arg);
175518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
176518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
177518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
178518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_surface_t* get_surface(EGLSurface surface) {
179518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_surface_t>(surface);
180518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
181518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
182518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
183518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_context_t* get_context(EGLContext context) {
184518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_context_t>(context);
185518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
186518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
187518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
188518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_image_t* get_image(EGLImageKHR image) {
189518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_image_t>(image);
190518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
191518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
192518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianstatic inline
193518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopianegl_sync_t* get_sync(EGLSyncKHR sync) {
194518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian    return egl_to_native_cast<egl_sync_t>(sync);
195518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}
196518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
197518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
198518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian}; // namespace android
199518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian// ----------------------------------------------------------------------------
200518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
201518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian#endif // ANDROID_EGL_OBJECT_H
202518ec112f468eb67bf681b3eec896d7bfb4ff98dMathias Agopian
203