diff --git a/cogl/winsys/cogl-winsys-egl-null.c b/cogl/winsys/cogl-winsys-egl-null.c index a3c1f7914..f0b920025 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 98caabf37..721931cae 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 c658fbca6..8d2009305 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; }