summaryrefslogtreecommitdiffstats
path: root/opengl/libs/EGL/egl_object.h
diff options
context:
space:
mode:
authorMathias Agopian <mathias@google.com>2011-05-13 16:21:08 -0700
committerMathias Agopian <mathias@google.com>2011-05-16 19:02:45 -0700
commit7adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7c (patch)
tree4c28764f141b482a42f152531e4920284a45f643 /opengl/libs/EGL/egl_object.h
parent90bf262591a1772d06a18581c11a6115b89fc143 (diff)
downloadframeworks_base-7adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7c.zip
frameworks_base-7adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7c.tar.gz
frameworks_base-7adf4ef0fad9973d9a07f2a73b2c4238c8e6bf7c.tar.bz2
refactor EGL source code
no changes is functionality. split various objects into their own files. make egl_display objec's lock internal.
Diffstat (limited to 'opengl/libs/EGL/egl_object.h')
-rw-r--r--opengl/libs/EGL/egl_object.h202
1 files changed, 202 insertions, 0 deletions
diff --git a/opengl/libs/EGL/egl_object.h b/opengl/libs/EGL/egl_object.h
new file mode 100644
index 0000000..ecb2514
--- /dev/null
+++ b/opengl/libs/EGL/egl_object.h
@@ -0,0 +1,202 @@
+/*
+ ** Copyright 2007, The Android Open Source Project
+ **
+ ** Licensed under the Apache License, Version 2.0 (the "License");
+ ** you may not use this file except in compliance with the License.
+ ** You may obtain a copy of the License at
+ **
+ ** http://www.apache.org/licenses/LICENSE-2.0
+ **
+ ** Unless required by applicable law or agreed to in writing, software
+ ** distributed under the License is distributed on an "AS IS" BASIS,
+ ** WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ ** See the License for the specific language governing permissions and
+ ** limitations under the License.
+ */
+
+#ifndef ANDROID_EGL_OBJECT_H
+#define ANDROID_EGL_OBJECT_H
+
+
+#include <ctype.h>
+#include <stdint.h>
+#include <stdlib.h>
+
+#include <EGL/egl.h>
+#include <EGL/eglext.h>
+#include <GLES/gl.h>
+#include <GLES/glext.h>
+
+#include <utils/threads.h>
+
+#include <system/window.h>
+
+#include "egl_display.h"
+
+// ----------------------------------------------------------------------------
+namespace android {
+// ----------------------------------------------------------------------------
+
+struct egl_display_t;
+
+class egl_object_t {
+ egl_display_t *display;
+ volatile int32_t terminated;
+ mutable volatile int32_t count;
+
+public:
+ egl_object_t(egl_display_t* display);
+
+ inline bool isAlive() const { return !terminated; }
+ inline int32_t incRef() { return android_atomic_inc(&count); }
+ inline int32_t decRef() { return android_atomic_dec(&count); }
+
+private:
+ bool get();
+ bool put();
+
+public:
+ template <typename N, typename T>
+ struct LocalRef {
+ N* ref;
+ LocalRef(T o) : ref(0) {
+ N* native = reinterpret_cast<N*>(o);
+ if (o && native->get()) {
+ ref = native;
+ }
+ }
+ ~LocalRef() {
+ if (ref && ref->put()) {
+ delete ref;
+ }
+ }
+ inline N* get() {
+ return ref;
+ }
+ void acquire() const {
+ if (ref) {
+ android_atomic_inc(&ref->count);
+ }
+ }
+ void release() const {
+ if (ref) {
+ int32_t c = android_atomic_dec(&ref->count);
+ // ref->count cannot be 1 prior atomic_dec because we have
+ // a reference, and if we have one, it means there was
+ // already one before us.
+ LOGE_IF(c==1, "refcount is now 0 in release()");
+ }
+ }
+ void terminate() {
+ if (ref) {
+ ref->terminated = 1;
+ release();
+ }
+ }
+ };
+};
+
+// ----------------------------------------------------------------------------
+
+struct egl_surface_t: public egl_object_t {
+ typedef egl_object_t::LocalRef<egl_surface_t, EGLSurface> Ref;
+
+ egl_surface_t(EGLDisplay dpy, EGLConfig config, EGLNativeWindowType win,
+ EGLSurface surface, int impl, egl_connection_t const* cnx) :
+ egl_object_t(get_display(dpy)), dpy(dpy), surface(surface),
+ config(config), win(win), impl(impl), cnx(cnx) {
+ }
+ ~egl_surface_t() {
+ }
+ EGLDisplay dpy;
+ EGLSurface surface;
+ EGLConfig config;
+ sp<ANativeWindow> win;
+ int impl;
+ egl_connection_t const* cnx;
+};
+
+struct egl_context_t: public egl_object_t {
+ typedef egl_object_t::LocalRef<egl_context_t, EGLContext> Ref;
+
+ egl_context_t(EGLDisplay dpy, EGLContext context, EGLConfig config,
+ int impl, egl_connection_t const* cnx, int version) :
+ egl_object_t(get_display(dpy)), dpy(dpy), context(context),
+ config(config), read(0), draw(0), impl(impl), cnx(cnx),
+ version(version) {
+ }
+ ~egl_context_t() {
+ }
+ EGLDisplay dpy;
+ EGLContext context;
+ EGLConfig config;
+ EGLSurface read;
+ EGLSurface draw;
+ int impl;
+ egl_connection_t const* cnx;
+ int version;
+};
+
+struct egl_image_t: public egl_object_t {
+ typedef egl_object_t::LocalRef<egl_image_t, EGLImageKHR> Ref;
+
+ egl_image_t(EGLDisplay dpy, EGLContext context) :
+ egl_object_t(get_display(dpy)), dpy(dpy), context(context) {
+ memset(images, 0, sizeof(images));
+ }
+ EGLDisplay dpy;
+ EGLContext context;
+ EGLImageKHR images[IMPL_NUM_IMPLEMENTATIONS];
+};
+
+struct egl_sync_t: public egl_object_t {
+ typedef egl_object_t::LocalRef<egl_sync_t, EGLSyncKHR> Ref;
+
+ egl_sync_t(EGLDisplay dpy, EGLContext context, EGLSyncKHR sync) :
+ egl_object_t(get_display(dpy)), dpy(dpy), context(context), sync(sync) {
+ }
+ EGLDisplay dpy;
+ EGLContext context;
+ EGLSyncKHR sync;
+};
+
+// ----------------------------------------------------------------------------
+
+typedef egl_surface_t::Ref SurfaceRef;
+typedef egl_context_t::Ref ContextRef;
+typedef egl_image_t::Ref ImageRef;
+typedef egl_sync_t::Ref SyncRef;
+
+// ----------------------------------------------------------------------------
+
+template<typename NATIVE, typename EGL>
+static inline NATIVE* egl_to_native_cast(EGL arg) {
+ return reinterpret_cast<NATIVE*>(arg);
+}
+
+static inline
+egl_surface_t* get_surface(EGLSurface surface) {
+ return egl_to_native_cast<egl_surface_t>(surface);
+}
+
+static inline
+egl_context_t* get_context(EGLContext context) {
+ return egl_to_native_cast<egl_context_t>(context);
+}
+
+static inline
+egl_image_t* get_image(EGLImageKHR image) {
+ return egl_to_native_cast<egl_image_t>(image);
+}
+
+static inline
+egl_sync_t* get_sync(EGLSyncKHR sync) {
+ return egl_to_native_cast<egl_sync_t>(sync);
+}
+
+// ----------------------------------------------------------------------------
+}; // namespace android
+// ----------------------------------------------------------------------------
+
+#endif // ANDROID_EGL_OBJECT_H
+