[cogl/wip/runtime-egl-platform: 10/12] Move the EGL null winsys out of cogl-winsys-egl



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]