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