egl_object.h revision eacd31f41ef1851bb420c65552b1aed6b74abe29
1951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen/*
2951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** Copyright 2007, The Android Open Source Project
3951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen **
4951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** Licensed under the Apache License, Version 2.0 (the "License");
5951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** you may not use this file except in compliance with the License.
6951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** You may obtain a copy of the License at
7951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen **
8951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen **     http://www.apache.org/licenses/LICENSE-2.0
9951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen **
10951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** Unless required by applicable law or agreed to in writing, software
11951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** distributed under the License is distributed on an "AS IS" BASIS,
12951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
13951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** See the License for the specific language governing permissions and
14951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen ** limitations under the License.
15951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen */
16e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes
17e5167f88f3734a048dc44199f3fff0432589db43Elliott Hughes#ifndef ANDROID_EGL_OBJECT_H
18951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#define ANDROID_EGL_OBJECT_H
19951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
20951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
21951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <ctype.h>
22951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <stdint.h>
23951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <stdlib.h>
24951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
25951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <EGL/egl.h>
26951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <EGL/eglext.h>
27951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
28951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/threads.h>
29951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/String8.h>
30951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <utils/Vector.h>
31951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
32951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include <system/window.h>
33951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
34951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#include "egl_display.h"
35951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
36951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
37951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chennamespace android {
38951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
39951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
40951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass egl_display_t;
41951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
42951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass egl_object_t {
43951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_display_t *display;
44951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    mutable volatile int32_t count;
45951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
46951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenprotected:
47951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    virtual ~egl_object_t();
48951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
49951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenpublic:
50951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_object_t(egl_display_t* display);
51951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    void destroy();
52951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
53951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    inline int32_t incRef() { return android_atomic_inc(&count); }
54951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    inline int32_t decRef() { return android_atomic_dec(&count); }
55951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    inline egl_display_t* getDisplay() const { return display; }
56951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
57951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenprivate:
58951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    void terminate();
59951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    static bool get(egl_display_t const* display, egl_object_t* object);
60951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
61951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenpublic:
62951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    template <typename N, typename T>
63951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    class LocalRef {
64951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        egl_object_t* ref;
65951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        LocalRef();
66951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        LocalRef(const LocalRef* rhs);
67951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    public:
68951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        ~LocalRef();
69951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        explicit LocalRef(egl_object_t* rhs);
70951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        explicit LocalRef(egl_display_t const* display, T o) : ref(0) {
71951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            egl_object_t* native = reinterpret_cast<N*>(o);
72951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            if (o && egl_object_t::get(display, native)) {
73951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen                ref = native;
74951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            }
75951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
76951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        inline N* get() {
77951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            return static_cast<N*>(ref);
78951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
79951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        void acquire() const;
80951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        void release() const;
81951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        void terminate();
82951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    };
83951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    template <typename N, typename T>
84951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    friend class LocalRef;
85951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
86951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
87951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate<typename N, typename T>
88951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenegl_object_t::LocalRef<N, T>::LocalRef(egl_object_t* rhs) : ref(rhs) {
89951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    if (ref) {
90951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        ref->incRef();
91951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
92951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
93951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
94951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate <typename N, typename T>
95951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenegl_object_t::LocalRef<N,T>::~LocalRef() {
96951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    if (ref) {
97951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        ref->destroy();
98951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
99951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
100951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
101951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate <typename N, typename T>
102951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenvoid egl_object_t::LocalRef<N,T>::acquire() const {
103951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    if (ref) {
104951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        ref->incRef();
105951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
106951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
107951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
108951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate <typename N, typename T>
109951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenvoid egl_object_t::LocalRef<N,T>::release() const {
110951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    if (ref) {
111951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        if (ref->decRef() == 1) {
112951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            // shouldn't happen because this is called from LocalRef
113951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            ALOGE("LocalRef::release() removed the last reference!");
114951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        }
115951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
116951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
117951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
118951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate <typename N, typename T>
119951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenvoid egl_object_t::LocalRef<N,T>::terminate() {
120951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    if (ref) {
121951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen        ref->terminate();
122951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    }
123951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
124951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
125951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
126951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
127951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass egl_surface_t : public egl_object_t {
128951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenprotected:
129951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    ~egl_surface_t();
130951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenpublic:
131951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
132951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
133951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_surface_t(egl_display_t* dpy, EGLConfig config,
134951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            EGLNativeWindowType win, EGLSurface surface,
135951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            egl_connection_t const* cnx);
136951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
137951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLSurface surface;
138951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLConfig config;
139951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    sp<ANativeWindow> win;
140951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_connection_t const* cnx;
141951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
142951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
143951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenclass egl_context_t: public egl_object_t {
144951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenprotected:
145951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    ~egl_context_t() {}
146951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenpublic:
147951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
148951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
149951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
150951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen            egl_connection_t const* cnx, int version);
151951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
152951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    void onLooseCurrent();
153951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    void onMakeCurrent(EGLSurface draw, EGLSurface read);
154951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
155951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLDisplay dpy;
156951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLContext context;
157951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLConfig config;
158951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLSurface read;
159951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    EGLSurface draw;
160951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    egl_connection_t const* cnx;
161951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    int version;
162951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    String8 gl_extensions;
163951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    Vector<String8> tokenized_gl_extensions;
164951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen};
165951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
166951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
167951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
168951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentypedef egl_surface_t::Ref  SurfaceRef;
169951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentypedef egl_context_t::Ref  ContextRef;
170951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
171951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
172951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
173951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chentemplate<typename NATIVE, typename EGL>
174951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatic inline NATIVE* egl_to_native_cast(EGL arg) {
175951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    return reinterpret_cast<NATIVE*>(arg);
176951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
177951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
178951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatic inline
179951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenegl_surface_t* get_surface(EGLSurface surface) {
180951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    return egl_to_native_cast<egl_surface_t>(surface);
181951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
182951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
183951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenstatic inline
184951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chenegl_context_t* get_context(EGLContext context) {
185951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen    return egl_to_native_cast<egl_context_t>(context);
186951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}
187951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
188951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
189951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen}; // namespace android
190951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen// ----------------------------------------------------------------------------
191951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen
192951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen#endif // ANDROID_EGL_OBJECT_H
193951bd8d1ad9581a414e171ad8605a9515d0ad667Mike J. Chen