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.

Reviewed-by: Robert Bragg <robert@linux.intel.com>
This commit is contained in:
Neil Roberts 2011-12-12 22:57:49 +00:00
parent a6b1f55546
commit f1d831d644
3 changed files with 188 additions and 50 deletions

View File

@ -31,6 +31,188 @@
#include "cogl-winsys-egl-null-private.h" #include "cogl-winsys-egl-null-private.h"
#include "cogl-winsys-egl-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 * const CoglWinsysVtable *
_cogl_winsys_egl_null_get_vtable (void) _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.id = COGL_WINSYS_ID_EGL_NULL;
vtable.name = "EGL_NULL"; vtable.name = "EGL_NULL";
vtable.renderer_connect = _cogl_winsys_renderer_connect;
vtable.renderer_disconnect = _cogl_winsys_renderer_disconnect;
vtable_inited = TRUE; vtable_inited = TRUE;
} }

View File

@ -110,8 +110,7 @@ typedef struct _CoglDisplayEGL
{ {
EGLContext egl_context; EGLContext egl_context;
EGLSurface dummy_surface; EGLSurface dummy_surface;
#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \ #if defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT) defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT)
int egl_surface_width; int egl_surface_width;
int egl_surface_height; int egl_surface_height;

View File

@ -200,7 +200,6 @@ _cogl_winsys_renderer_connect (CoglRenderer *renderer,
case COGL_WINSYS_ID_EGL_GDL: case COGL_WINSYS_ID_EGL_GDL:
case COGL_WINSYS_ID_EGL_ANDROID: case COGL_WINSYS_ID_EGL_ANDROID:
case COGL_WINSYS_ID_EGL_NULL:
egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY); egl_renderer->edpy = eglGetDisplay (EGL_DEFAULT_DISPLAY);
break; break;
} }
@ -471,40 +470,6 @@ try_create_context (CoglDisplay *display,
&egl_display->egl_surface_height); &egl_display->egl_surface_height);
break; break;
#endif #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; return TRUE;
@ -540,9 +505,7 @@ cleanup_context (CoglDisplay *display)
default: default:
break; break;
#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \ #if defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT)
defined (COGL_HAS_EGL_PLATFORM_GDL_SUPPORT)
case COGL_WINSYS_ID_EGL_NULL:
case COGL_WINSYS_ID_EGL_GDL: case COGL_WINSYS_ID_EGL_GDL:
if (egl_display->egl_surface != EGL_NO_SURFACE) if (egl_display->egl_surface != EGL_NO_SURFACE)
{ {
@ -843,10 +806,8 @@ _cogl_winsys_onscreen_init (CoglOnscreen *onscreen,
} }
break; break;
#if defined (COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT) || \ #if defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT) || \
defined (COGL_HAS_EGL_PLATFORM_GDL_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_ANDROID:
case COGL_WINSYS_ID_EGL_GDL: case COGL_WINSYS_ID_EGL_GDL:
@ -878,9 +839,6 @@ _cogl_winsys_onscreen_deinit (CoglOnscreen *onscreen)
CoglContext *context = framebuffer->context; CoglContext *context = framebuffer->context;
CoglRenderer *renderer = context->display->renderer; CoglRenderer *renderer = context->display->renderer;
CoglRendererEGL *egl_renderer = renderer->winsys; 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; CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
/* If we never successfully allocated then there's nothing to do */ /* 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)
egl_renderer->platform_vtable->onscreen_deinit (onscreen); 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); g_slice_free (CoglOnscreenEGL, onscreen->winsys);
onscreen->winsys = NULL; onscreen->winsys = NULL;
} }