[cogl/wip/runtime-egl-platform: 10/12] Move the EGL null 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: 10/12] Move the EGL null winsys out of cogl-winsys-egl
- Date: Tue, 13 Dec 2011 12:26:37 +0000 (UTC)
commit 6a87fc1a8177bb230e6c5c1ed744e974a8a568fd
Author: Neil Roberts <neil linux intel com>
Date: Mon Dec 12 22:57:49 2011 +0000
Move the EGL null winsys out of cogl-winsys-egl
This moves all of the code specific to the null winsys out of
cogl-winsys-egl.
cogl/winsys/cogl-winsys-egl-null.c | 185 +++++++++++++++++++++++++++++++++
cogl/winsys/cogl-winsys-egl-private.h | 3 +-
cogl/winsys/cogl-winsys-egl.c | 50 +---------
3 files changed, 188 insertions(+), 50 deletions(-)
---
diff --git a/cogl/winsys/cogl-winsys-egl-null.c b/cogl/winsys/cogl-winsys-egl-null.c
index a3c1f79..f0b9200 100644
--- a/cogl/winsys/cogl-winsys-egl-null.c
+++ b/cogl/winsys/cogl-winsys-egl-null.c
@@ -31,6 +31,188 @@
#include "cogl-winsys-egl-null-private.h"
#include "cogl-winsys-egl-private.h"
+#include "cogl-renderer-private.h"
+#include "cogl-framebuffer-private.h"
+#include "cogl-onscreen-private.h"
+
+static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable;
+
+typedef struct _CoglDisplayNull
+{
+ int egl_surface_width;
+ int egl_surface_height;
+ gboolean have_onscreen;
+} CoglDisplayNull;
+
+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;
+ CoglDisplayNull *null_display = egl_display->platform;
+ const char *error_message;
+
+ egl_display->egl_surface =
+ eglCreateWindowSurface (egl_renderer->edpy,
+ egl_display->egl_config,
+ (NativeWindowType) NULL,
+ 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,
+ &null_display->egl_surface_width);
+
+ eglQuerySurface (egl_renderer->edpy,
+ egl_display->egl_surface,
+ EGL_HEIGHT,
+ &null_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;
+ CoglDisplayNull *null_display;
+
+ null_display = g_slice_new0 (CoglDisplayNull);
+ egl_display->platform = null_display;
+
+ return TRUE;
+}
+
+static void
+_cogl_winsys_egl_display_destroy (CoglDisplay *display)
+{
+ CoglDisplayEGL *egl_display = display->winsys;
+
+ g_slice_free (CoglDisplayNull, egl_display->platform);
+}
+
+static void
+_cogl_winsys_egl_cleanup_context (CoglDisplay *display)
+{
+ CoglRenderer *renderer = display->renderer;
+ CoglRendererEGL *egl_renderer = renderer->winsys;
+ CoglDisplayEGL *egl_display = display->winsys;
+
+ if (egl_display->egl_surface != EGL_NO_SURFACE)
+ {
+ eglDestroySurface (egl_renderer->edpy, egl_display->egl_surface);
+ egl_display->egl_surface = EGL_NO_SURFACE;
+ }
+}
+
+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;
+ CoglDisplayNull *null_display = egl_display->platform;
+ CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
+
+ if (null_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,
+ null_display->egl_surface_width,
+ null_display->egl_surface_height);
+ null_display->have_onscreen = TRUE;
+
+ return TRUE;
+}
+
+static void
+_cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen)
+{
+ CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
+ CoglContext *context = framebuffer->context;
+ CoglDisplay *display = context->display;
+ CoglDisplayEGL *egl_display = display->winsys;
+ CoglDisplayNull *null_display = egl_display->platform;
+
+ null_display->have_onscreen = FALSE;
+}
+
+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,
+ .cleanup_context = _cogl_winsys_egl_cleanup_context,
+ .onscreen_init = _cogl_winsys_egl_onscreen_init,
+ .onscreen_deinit = _cogl_winsys_egl_onscreen_deinit
+ };
const CoglWinsysVtable *
_cogl_winsys_egl_null_get_vtable (void)
@@ -48,6 +230,9 @@ _cogl_winsys_egl_null_get_vtable (void)
vtable.id = COGL_WINSYS_ID_EGL_NULL;
vtable.name = "EGL_NULL";
+ 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 98caabf..721931c 100644
--- a/cogl/winsys/cogl-winsys-egl-private.h
+++ b/cogl/winsys/cogl-winsys-egl-private.h
@@ -110,8 +110,7 @@ typedef struct _CoglDisplayEGL
{
EGLContext egl_context;
EGLSurface dummy_surface;
-#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \
- defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT) || \
+#if defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT)
int egl_surface_width;
int egl_surface_height;
diff --git a/cogl/winsys/cogl-winsys-egl.c b/cogl/winsys/cogl-winsys-egl.c
index c658fbc..8d20093 100644
--- a/cogl/winsys/cogl-winsys-egl.c
+++ b/cogl/winsys/cogl-winsys-egl.c
@@ -200,7 +200,6 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
case COGL_WINSYS_ID_EGL_GDL:
case COGL_WINSYS_ID_EGL_ANDROID:
- case COGL_WINSYS_ID_EGL_NULL:
egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
break;
}
@@ -471,40 +470,6 @@ try_create_context (CoglDisplay *display,
&egl_display->egl_surface_height);
break;
#endif
-
-#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
- case COGL_WINSYS_ID_EGL_NULL:
- egl_display->egl_surface =
- eglCreateWindowSurface (edpy,
- config,
- (NativeWindowType) NULL,
- 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
}
return TRUE;
@@ -540,9 +505,7 @@ cleanup_context (CoglDisplay *display)
default:
break;
-#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \
- defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT)
- case COGL_WINSYS_ID_EGL_NULL:
+#if defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT)
case COGL_WINSYS_ID_EGL_GDL:
if (egl_display->egl_surface != EGL_NO_SURFACE)
{
@@ -843,10 +806,8 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
}
break;
-#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \
- defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT) || \
+#if defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT)
- case COGL_WINSYS_ID_EGL_NULL:
case COGL_WINSYS_ID_EGL_ANDROID:
case COGL_WINSYS_ID_EGL_GDL:
@@ -878,9 +839,6 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
CoglContext *context = framebuffer->context;
CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys;
-#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
- CoglDisplayEGL *egl_display = context->display->winsys;
-#endif
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
/* If we never successfully allocated then there's nothing to do */
@@ -898,10 +856,6 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
egl_renderer->platform_vtable->onscreen_deinit)
egl_renderer->platform_vtable->onscreen_deinit (onscreen);
-#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
- egl_display->have_onscreen = FALSE;
-#endif
-
g_slice_free (CoglOnscreenEGL, onscreen->winsys);
onscreen->winsys = NULL;
}
[
Date Prev][
Date Next] [
Thread Prev][
Thread Next]
[
Thread Index]
[
Date Index]
[
Author Index]