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:
parent
a6b1f55546
commit
f1d831d644
@ -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;
|
||||
}
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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;
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user