[cogl/wip/runtime-egl-platform: 11/11] Move the EGL Android winsys out of cogl-winsys-egl
- From: Neil Roberts <nroberts src gnome org>
- To: commits-list gnome org
- Cc:
- Subject: [cogl/wip/runtime-egl-platform: 11/11] Move the EGL Android winsys out of cogl-winsys-egl
- Date: Tue, 13 Dec 2011 13:15:42 +0000 (UTC)
commit 29114926027b6283f85336bc5287e555087c8e68
Author: Neil Roberts <neil linux intel com>
Date: Tue Dec 13 13:09:34 2011 +0000
Move the EGL Android winsys out of cogl-winsys-egl
This moves all of the code specific to the Android platform out of
cogl-winsys-egl. It is completely untested apart from that it
compiles using a dummy android/native_window.h header.
cogl/winsys/cogl-winsys-egl-android.c | 192 +++++++++++++++++++++++++++++++++
cogl/winsys/cogl-winsys-egl-private.h | 5 -
cogl/winsys/cogl-winsys-egl.c | 182 ++++---------------------------
3 files changed, 213 insertions(+), 166 deletions(-)
---
diff --git a/cogl/winsys/cogl-winsys-egl-android.c b/cogl/winsys/cogl-winsys-egl-android.c
index e4bdea5..2efa6b2 100644
--- a/cogl/winsys/cogl-winsys-egl-android.c
+++ b/cogl/winsys/cogl-winsys-egl-android.c
@@ -29,8 +29,197 @@
#include "config.h"
#endif
+#include <android/native_window.h>
+
#include "cogl-winsys-egl-android-private.h"
#include "cogl-winsys-egl-private.h"
+#include "cogl-renderer-private.h"
+#include "cogl-framebuffer-private.h"
+#include "cogl-onscreen-private.h"
+#include "cogl-private.h"
+
+static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable;
+
+typedef struct _CoglDisplayAndroid
+{
+ int egl_surface_width;
+ int egl_surface_height;
+ gboolean have_onscreen;
+} CoglDisplayAndroid;
+
+static ANativeWindow *android_native_window;
+
+void
+cogl_android_set_native_window (ANativeWindow *window)
+{
+ _cogl_init ();
+
+ android_native_window = window;
+}
+
+static void
+_cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
+{
+ CoglRendererEGL *egl_renderer = renderer->winsys;
+
+ eglTerminate (egl_renderer->edpy);
+
+ g_slice_free (CoglRendererEGL, egl_renderer);
+}
+
+static gboolean
+_cogl_winsys_renderer_connect (CoglRenderer *renderer,
+ GError **error)
+{
+ CoglRendererEGL *egl_renderer;
+
+ renderer->winsys = g_slice_new0 (CoglRendererEGL);
+ egl_renderer = renderer->winsys;
+
+ egl_renderer->platform_vtable = &_cogl_winsys_egl_vtable;
+
+ egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
+
+ if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
+ goto error;
+
+ return TRUE;
+
+error:
+ _cogl_winsys_renderer_disconnect (renderer);
+ return FALSE;
+}
+
+static gboolean
+_cogl_winsys_egl_context_created (CoglDisplay *display,
+ GError **error)
+{
+ CoglRenderer *renderer = display->renderer;
+ CoglRendererEGL *egl_renderer = renderer->winsys;
+ CoglDisplayEGL *egl_display = display->winsys;
+ CoglDisplayAndroid *android_display = egl_display->platform;
+ const char *error_message;
+ EGLint format;
+
+ if (android_native_window == NULL)
+ {
+ error_message = "No ANativeWindow window specified with "
+ "cogl_android_set_native_window()";
+ goto fail;
+ }
+
+ /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
+ * guaranteed to be accepted by ANativeWindow_setBuffersGeometry ().
+ * As soon as we picked a EGLConfig, we can safely reconfigure the
+ * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
+ eglGetConfigAttrib (egl_renderer->edpy,
+ egl_display->egl_config,
+ EGL_NATIVE_VISUAL_ID, &format);
+
+ ANativeWindow_setBuffersGeometry (android_native_window,
+ 0,
+ 0,
+ format);
+
+ egl_display->egl_surface =
+ eglCreateWindowSurface (egl_renderer->edpy,
+ egl_display->egl_config,
+ (NativeWindowType) android_native_window,
+ NULL);
+ if (egl_display->egl_surface == EGL_NO_SURFACE)
+ {
+ error_message = "Unable to create EGL window surface";
+ goto fail;
+ }
+
+ if (!eglMakeCurrent (egl_renderer->edpy,
+ egl_display->egl_surface,
+ egl_display->egl_surface,
+ egl_display->egl_context))
+ {
+ error_message = "Unable to eglMakeCurrent with egl surface";
+ goto fail;
+ }
+
+ eglQuerySurface (egl_renderer->edpy,
+ egl_display->egl_surface,
+ EGL_WIDTH,
+ &android_display->egl_surface_width);
+
+ eglQuerySurface (egl_renderer->edpy,
+ egl_display->egl_surface,
+ EGL_HEIGHT,
+ &android_display->egl_surface_height);
+
+ return TRUE;
+
+ fail:
+ g_set_error (error, COGL_WINSYS_ERROR,
+ COGL_WINSYS_ERROR_CREATE_CONTEXT,
+ "%s", error_message);
+ return FALSE;
+}
+
+static gboolean
+_cogl_winsys_egl_display_setup (CoglDisplay *display,
+ GError **error)
+{
+ CoglDisplayEGL *egl_display = display->winsys;
+ CoglDisplayAndroid *android_display;
+
+ android_display = g_slice_new0 (CoglDisplayAndroid);
+ egl_display->platform = android_display;
+
+ return TRUE;
+}
+
+static void
+_cogl_winsys_egl_display_destroy (CoglDisplay *display)
+{
+ CoglDisplayEGL *egl_display = display->winsys;
+
+ g_slice_free (CoglDisplayAndroid, egl_display->platform);
+}
+
+static gboolean
+_cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen,
+ EGLConfig egl_config,
+ GError **error)
+{
+ CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
+ CoglContext *context = framebuffer->context;
+ CoglDisplay *display = context->display;
+ CoglDisplayEGL *egl_display = display->winsys;
+ CoglDisplayAndroid *android_display = egl_display->platform;
+ CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
+
+ if (android_display->have_onscreen)
+ {
+ g_set_error (error, COGL_WINSYS_ERROR,
+ COGL_WINSYS_ERROR_CREATE_ONSCREEN,
+ "EGL platform only supports a single onscreen window");
+ return FALSE;
+ }
+
+ egl_onscreen->egl_surface = egl_display->egl_surface;
+
+ _cogl_framebuffer_winsys_update_size (framebuffer,
+ android_display->egl_surface_width,
+ android_display->egl_surface_height);
+
+ android_display->have_onscreen = TRUE;
+
+ return TRUE;
+}
+
+static const CoglWinsysEGLVtable
+_cogl_winsys_egl_vtable =
+ {
+ .display_setup = _cogl_winsys_egl_display_setup,
+ .display_destroy = _cogl_winsys_egl_display_destroy,
+ .context_created = _cogl_winsys_egl_context_created,
+ .onscreen_init = _cogl_winsys_egl_onscreen_init,
+ };
const CoglWinsysVtable *
_cogl_winsys_egl_android_get_vtable (void)
@@ -48,6 +237,9 @@ _cogl_winsys_egl_android_get_vtable (void)
vtable.id = COGL_WINSYS_ID_EGL_ANDROID;
vtable.name = "EGL_ANDROID";
+ vtable.renderer_connect = _cogl_winsys_renderer_connect;
+ vtable.renderer_disconnect = _cogl_winsys_renderer_disconnect;
+
vtable_inited = TRUE;
}
diff --git a/cogl/winsys/cogl-winsys-egl-private.h b/cogl/winsys/cogl-winsys-egl-private.h
index 8c385fc..6658278 100644
--- a/cogl/winsys/cogl-winsys-egl-private.h
+++ b/cogl/winsys/cogl-winsys-egl-private.h
@@ -112,11 +112,6 @@ typedef struct _CoglDisplayEGL
{
EGLContext egl_context;
EGLSurface dummy_surface;
-#if defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT)
- int egl_surface_width;
- int egl_surface_height;
- gboolean have_onscreen;
-#endif
EGLSurface egl_surface;
EGLConfig egl_config;
diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c
index a4cbca5..ce5d5da 100644
--- a/cogl/winsys/cogl-winsys-egl.c
+++ b/cogl/winsys/cogl-winsys-egl.c
@@ -43,10 +43,6 @@
#include "cogl-private.h"
-#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
-#include <android/native_window.h>
-#endif
-
#include <stdlib.h>
#include <stdio.h>
#include <sys/types.h>
@@ -104,26 +100,11 @@ _cogl_winsys_renderer_get_proc_address (CoglRenderer *renderer,
return ptr;
}
-#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
-static ANativeWindow *android_native_window;
-
-void
-cogl_android_set_native_window (ANativeWindow *window)
-{
- _cogl_init ();
-
- android_native_window = window;
-}
-#endif
-
static void
_cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
{
- CoglRendererEGL *egl_renderer = renderer->winsys;
-
- eglTerminate (egl_renderer->edpy);
-
- g_slice_free (CoglRendererEGL, egl_renderer);
+ /* This function must be overridden by a platform winsys */
+ g_assert_not_reached ();
}
/* Updates all the function pointers */
@@ -176,31 +157,8 @@ static gboolean
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
GError **error)
{
- CoglRendererEGL *egl_renderer;
-
- renderer->winsys = g_slice_new0 (CoglRendererEGL);
-
- egl_renderer = renderer->winsys;
-
- switch (renderer->winsys_vtable->id)
- {
- default:
- g_warn_if_reached ();
- goto error;
-
- case COGL_WINSYS_ID_EGL_ANDROID:
- egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
- break;
- }
-
- if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
- goto error;
-
- return TRUE;
-
-error:
- _cogl_winsys_renderer_disconnect (renderer);
- return FALSE;
+ /* This function must be overridden by a platform winsys */
+ g_assert_not_reached ();
}
static void
@@ -214,8 +172,7 @@ egl_attributes_from_framebuffer_config (CoglDisplay *display,
int i = 0;
/* Let the platform add attributes first */
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->add_config_attributes)
+ if (egl_renderer->platform_vtable->add_config_attributes)
i = egl_renderer->platform_vtable->add_config_attributes (display,
config,
attributes);
@@ -293,8 +250,7 @@ try_create_context (CoglDisplay *display,
attribs[0] = EGL_NONE;
/* Divert to the platform implementation if one is defined */
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->try_create_context)
+ if (egl_renderer->platform_vtable->try_create_context)
return egl_renderer->platform_vtable->
try_create_context (display, attribs, error);
@@ -327,71 +283,9 @@ try_create_context (CoglDisplay *display,
goto fail;
}
- switch (renderer->winsys_vtable->id)
- {
- default:
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->context_created &&
- !egl_renderer->platform_vtable->context_created (display, error))
- return FALSE;
- break;
-
-#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
- case COGL_WINSYS_ID_EGL_ANDROID:
- {
- EGLint format;
-
- if (android_native_window == NULL)
- {
- error_message = "No ANativeWindow window specified with "
- "cogl_android_set_native_window()";
- goto fail;
- }
-
- /* EGL_NATIVE_VISUAL_ID is an attribute of the EGLConfig that is
- * guaranteed to be accepted by ANativeWindow_setBuffersGeometry ().
- * As soon as we picked a EGLConfig, we can safely reconfigure the
- * ANativeWindow buffers to match, using EGL_NATIVE_VISUAL_ID. */
- eglGetConfigAttrib (edpy, config, EGL_NATIVE_VISUAL_ID, &format);
-
- ANativeWindow_setBuffersGeometry (android_native_window,
- 0,
- 0,
- format);
-
- egl_display->egl_surface =
- eglCreateWindowSurface (edpy,
- config,
- (NativeWindowType) android_native_window,
- NULL);
- if (egl_display->egl_surface == EGL_NO_SURFACE)
- {
- error_message = "Unable to create EGL window surface";
- goto fail;
- }
-
- if (!eglMakeCurrent (egl_renderer->edpy,
- egl_display->egl_surface,
- egl_display->egl_surface,
- egl_display->egl_context))
- {
- error_message = "Unable to eglMakeCurrent with egl surface";
- goto fail;
- }
-
- eglQuerySurface (egl_renderer->edpy,
- egl_display->egl_surface,
- EGL_WIDTH,
- &egl_display->egl_surface_width);
-
- eglQuerySurface (egl_renderer->edpy,
- egl_display->egl_surface,
- EGL_HEIGHT,
- &egl_display->egl_surface_height);
- }
- break;
-#endif
- }
+ if (egl_renderer->platform_vtable->context_created &&
+ !egl_renderer->platform_vtable->context_created (display, error))
+ return FALSE;
return TRUE;
@@ -417,8 +311,7 @@ cleanup_context (CoglDisplay *display)
egl_display->egl_context = EGL_NO_CONTEXT;
}
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->cleanup_context)
+ if (egl_renderer->platform_vtable->cleanup_context)
egl_renderer->platform_vtable->cleanup_context (display);
}
@@ -457,8 +350,7 @@ _cogl_winsys_display_destroy (CoglDisplay *display)
cleanup_context (display);
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->display_destroy)
+ if (egl_renderer->platform_vtable->display_destroy)
egl_renderer->platform_vtable->display_destroy (display);
g_slice_free (CoglDisplayEGL, display->winsys);
@@ -489,8 +381,7 @@ _cogl_winsys_display_setup (CoglDisplay *display,
}
#endif
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->display_setup &&
+ if (egl_renderer->platform_vtable->display_setup &&
!egl_renderer->platform_vtable->display_setup (display, error))
goto error;
@@ -532,8 +423,7 @@ _cogl_winsys_context_init (CoglContext *context, GError **error)
COGL_WINSYS_FEATURE_SWAP_REGION_THROTTLE, TRUE);
}
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->context_init &&
+ if (egl_renderer->platform_vtable->context_init &&
!egl_renderer->platform_vtable->context_init (context, error))
return FALSE;
@@ -546,8 +436,7 @@ _cogl_winsys_context_deinit (CoglContext *context)
CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys;
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->context_deinit)
+ if (egl_renderer->platform_vtable->context_deinit)
egl_renderer->platform_vtable->context_deinit (context);
g_free (context->winsys);
@@ -563,7 +452,6 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
CoglDisplayEGL *egl_display = display->winsys;
CoglRenderer *renderer = display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys;
- CoglOnscreenEGL *egl_onscreen;
EGLint attributes[MAX_EGL_CONFIG_ATTRIBS];
EGLConfig egl_config;
EGLint config_count = 0;
@@ -603,41 +491,14 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
}
onscreen->winsys = g_slice_new0 (CoglOnscreenEGL);
- egl_onscreen = onscreen->winsys;
- switch (renderer->winsys_vtable->id)
+ if (egl_renderer->platform_vtable->onscreen_init &&
+ !egl_renderer->platform_vtable->onscreen_init (onscreen,
+ egl_config,
+ error))
{
- default:
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->onscreen_init &&
- !egl_renderer->platform_vtable->onscreen_init (onscreen,
- egl_config,
- error))
- {
- g_slice_free (CoglOnscreenEGL, onscreen->winsys);
- return FALSE;
- }
- break;
-
-#if defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT)
- case COGL_WINSYS_ID_EGL_ANDROID:
-
- if (egl_display->have_onscreen)
- {
- g_set_error (error, COGL_WINSYS_ERROR,
- COGL_WINSYS_ERROR_CREATE_ONSCREEN,
- "EGL platform only supports a single onscreen window");
- return FALSE;
- }
-
- egl_onscreen->egl_surface = egl_display->egl_surface;
-
- _cogl_framebuffer_winsys_update_size (framebuffer,
- egl_display->egl_surface_width,
- egl_display->egl_surface_height);
- egl_display->have_onscreen = TRUE;
- break;
-#endif
+ g_slice_free (CoglOnscreenEGL, onscreen->winsys);
+ return FALSE;
}
return TRUE;
@@ -663,8 +524,7 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
egl_onscreen->egl_surface = EGL_NO_SURFACE;
}
- if (egl_renderer->platform_vtable &&
- egl_renderer->platform_vtable->onscreen_deinit)
+ if (egl_renderer->platform_vtable->onscreen_deinit)
egl_renderer->platform_vtable->onscreen_deinit (onscreen);
g_slice_free (CoglOnscreenEGL, onscreen->winsys);
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]