cogl: add Mir EGL platform
This commit is contained in:
parent
bf3954ebe3
commit
672eff0c6c
@ -503,6 +503,11 @@ cogl_sources_c += \
|
|||||||
$(srcdir)/winsys/cogl-winsys-egl-android.c \
|
$(srcdir)/winsys/cogl-winsys-egl-android.c \
|
||||||
$(srcdir)/winsys/cogl-winsys-egl-android-private.h
|
$(srcdir)/winsys/cogl-winsys-egl-android-private.h
|
||||||
endif
|
endif
|
||||||
|
if SUPPORT_EGL_PLATFORM_MIR
|
||||||
|
cogl_sources_c += \
|
||||||
|
$(srcdir)/winsys/cogl-winsys-egl-mir.c \
|
||||||
|
$(srcdir)/winsys/cogl-winsys-egl-mir-private.h
|
||||||
|
endif
|
||||||
if SUPPORT_EGL
|
if SUPPORT_EGL
|
||||||
cogl_experimental_h += \
|
cogl_experimental_h += \
|
||||||
$(srcdir)/cogl-egl.h
|
$(srcdir)/cogl-egl.h
|
||||||
|
@ -267,6 +267,11 @@ cogl_wayland_onscreen_resize (CoglOnscreen *onscreen,
|
|||||||
int offset_y);
|
int offset_y);
|
||||||
#endif /* COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT */
|
#endif /* COGL_HAS_EGL_PLATFORM_WAYLAND_SUPPORT */
|
||||||
|
|
||||||
|
#if defined (COGL_HAS_EGL_PLATFORM_MIR_SUPPORT)
|
||||||
|
struct MirSurface *
|
||||||
|
cogl_mir_onscreen_get_surface (CoglOnscreen *onscreen);
|
||||||
|
#endif /* COGL_HAS_EGL_PLATFORM_MIR_SUPPORT */
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* cogl_onscreen_set_swap_throttled:
|
* cogl_onscreen_set_swap_throttled:
|
||||||
* @onscreen: A #CoglOnscreen framebuffer
|
* @onscreen: A #CoglOnscreen framebuffer
|
||||||
|
@ -66,6 +66,9 @@
|
|||||||
#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
|
#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
|
||||||
#include "cogl-winsys-egl-android-private.h"
|
#include "cogl-winsys-egl-android-private.h"
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef COGL_HAS_EGL_PLATFORM_MIR_SUPPORT
|
||||||
|
#include "cogl-winsys-egl-mir-private.h"
|
||||||
|
#endif
|
||||||
#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
|
#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
|
||||||
#include "cogl-winsys-egl-null-private.h"
|
#include "cogl-winsys-egl-null-private.h"
|
||||||
#endif
|
#endif
|
||||||
@ -213,6 +216,9 @@ static CoglWinsysVtableGetter _cogl_winsys_vtable_getters[] =
|
|||||||
#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
|
#ifdef COGL_HAS_EGL_PLATFORM_ANDROID_SUPPORT
|
||||||
_cogl_winsys_egl_android_get_vtable,
|
_cogl_winsys_egl_android_get_vtable,
|
||||||
#endif
|
#endif
|
||||||
|
#ifdef COGL_HAS_EGL_PLATFORM_MIR_SUPPORT
|
||||||
|
_cogl_winsys_egl_mir_get_vtable,
|
||||||
|
#endif
|
||||||
#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
|
#ifdef COGL_HAS_EGL_PLATFORM_POWERVR_NULL_SUPPORT
|
||||||
_cogl_winsys_egl_null_get_vtable,
|
_cogl_winsys_egl_null_get_vtable,
|
||||||
#endif
|
#endif
|
||||||
|
@ -168,6 +168,7 @@ cogl_renderer_new (void);
|
|||||||
* @COGL_WINSYS_ID_EGL_WAYLAND: Use EGL with the Wayland window system
|
* @COGL_WINSYS_ID_EGL_WAYLAND: Use EGL with the Wayland window system
|
||||||
* @COGL_WINSYS_ID_EGL_KMS: Use EGL with the KMS platform
|
* @COGL_WINSYS_ID_EGL_KMS: Use EGL with the KMS platform
|
||||||
* @COGL_WINSYS_ID_EGL_ANDROID: Use EGL with the Android platform
|
* @COGL_WINSYS_ID_EGL_ANDROID: Use EGL with the Android platform
|
||||||
|
* @COGL_WINSYS_ID_EGL_MIR: Use EGL with the Mir server
|
||||||
* @COGL_WINSYS_ID_WGL: Use the Microsoft Windows WGL binding API
|
* @COGL_WINSYS_ID_WGL: Use the Microsoft Windows WGL binding API
|
||||||
* @COGL_WINSYS_ID_SDL: Use the SDL window system
|
* @COGL_WINSYS_ID_SDL: Use the SDL window system
|
||||||
*
|
*
|
||||||
@ -187,6 +188,7 @@ typedef enum
|
|||||||
COGL_WINSYS_ID_EGL_WAYLAND,
|
COGL_WINSYS_ID_EGL_WAYLAND,
|
||||||
COGL_WINSYS_ID_EGL_KMS,
|
COGL_WINSYS_ID_EGL_KMS,
|
||||||
COGL_WINSYS_ID_EGL_ANDROID,
|
COGL_WINSYS_ID_EGL_ANDROID,
|
||||||
|
COGL_WINSYS_ID_EGL_MIR,
|
||||||
COGL_WINSYS_ID_WGL,
|
COGL_WINSYS_ID_WGL,
|
||||||
COGL_WINSYS_ID_SDL
|
COGL_WINSYS_ID_SDL
|
||||||
} CoglWinsysID;
|
} CoglWinsysID;
|
||||||
|
39
cogl/winsys/cogl-winsys-egl-mir-private.h
Normal file
39
cogl/winsys/cogl-winsys-egl-mir-private.h
Normal file
@ -0,0 +1,39 @@
|
|||||||
|
/*
|
||||||
|
* Cogl
|
||||||
|
*
|
||||||
|
* A Low-Level GPU Graphics and Utilities API
|
||||||
|
*
|
||||||
|
* Copyright (C) 2011 Canonical Ltd.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use, copy,
|
||||||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef __COGL_WINSYS_EGL_MIR_PRIVATE_H
|
||||||
|
#define __COGL_WINSYS_EGL_MIR_PRIVATE_H
|
||||||
|
|
||||||
|
#include "cogl-winsys-private.h"
|
||||||
|
|
||||||
|
const CoglWinsysVtable *
|
||||||
|
_cogl_winsys_egl_mir_get_vtable (void);
|
||||||
|
|
||||||
|
#endif /* __COGL_WINSYS_EGL_MIR_PRIVATE_H */
|
447
cogl/winsys/cogl-winsys-egl-mir.c
Normal file
447
cogl/winsys/cogl-winsys-egl-mir.c
Normal file
@ -0,0 +1,447 @@
|
|||||||
|
/*
|
||||||
|
* Cogl
|
||||||
|
*
|
||||||
|
* A Low-Level GPU Graphics and Utilities API
|
||||||
|
*
|
||||||
|
* Copyright (C) 2014 Canonical Ltd.
|
||||||
|
*
|
||||||
|
* Permission is hereby granted, free of charge, to any person
|
||||||
|
* obtaining a copy of this software and associated documentation
|
||||||
|
* files (the "Software"), to deal in the Software without
|
||||||
|
* restriction, including without limitation the rights to use, copy,
|
||||||
|
* modify, merge, publish, distribute, sublicense, and/or sell copies
|
||||||
|
* of the Software, and to permit persons to whom the Software is
|
||||||
|
* furnished to do so, subject to the following conditions:
|
||||||
|
*
|
||||||
|
* The above copyright notice and this permission notice shall be
|
||||||
|
* included in all copies or substantial portions of the Software.
|
||||||
|
*
|
||||||
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
||||||
|
* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
||||||
|
* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
||||||
|
* NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
* BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN
|
||||||
|
* ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
||||||
|
* CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
* SOFTWARE.
|
||||||
|
*
|
||||||
|
*
|
||||||
|
* Authors:
|
||||||
|
* Marco Trevisan <marco.trevisan@canonical.com>
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef HAVE_CONFIG_H
|
||||||
|
#include "config.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <mir_toolkit/mir_client_library.h>
|
||||||
|
#include <string.h>
|
||||||
|
#include <errno.h>
|
||||||
|
|
||||||
|
#include "cogl-winsys-egl-mir-private.h"
|
||||||
|
#include "cogl-winsys-egl-private.h"
|
||||||
|
#include "cogl-renderer-private.h"
|
||||||
|
#include "cogl-onscreen-private.h"
|
||||||
|
#include "cogl-error-private.h"
|
||||||
|
|
||||||
|
static const CoglWinsysEGLVtable _cogl_winsys_egl_vtable;
|
||||||
|
|
||||||
|
static const CoglWinsysVtable *parent_vtable;
|
||||||
|
|
||||||
|
typedef struct _CoglRendererMir
|
||||||
|
{
|
||||||
|
MirConnection *mir_connection;
|
||||||
|
} CoglRendererMir;
|
||||||
|
|
||||||
|
typedef struct _CoglDisplayMir
|
||||||
|
{
|
||||||
|
MirSurface *dummy_mir_surface;
|
||||||
|
} CoglDisplayMir;
|
||||||
|
|
||||||
|
typedef struct _CoglOnscreenMir
|
||||||
|
{
|
||||||
|
MirSurface *mir_surface;
|
||||||
|
MirSurfaceState last_state;
|
||||||
|
} CoglOnscreenMir;
|
||||||
|
|
||||||
|
|
||||||
|
static MirPixelFormat
|
||||||
|
_mir_connection_get_valid_format (MirConnection *connection)
|
||||||
|
{
|
||||||
|
MirPixelFormat formats[mir_pixel_formats];
|
||||||
|
guint valid_formats;
|
||||||
|
guint f;
|
||||||
|
|
||||||
|
mir_connection_get_available_surface_formats(connection, formats,
|
||||||
|
mir_pixel_formats,
|
||||||
|
&valid_formats);
|
||||||
|
|
||||||
|
for (f = 0; f < valid_formats; f++)
|
||||||
|
{
|
||||||
|
switch (formats[f])
|
||||||
|
{
|
||||||
|
case mir_pixel_format_abgr_8888:
|
||||||
|
case mir_pixel_format_xbgr_8888:
|
||||||
|
case mir_pixel_format_argb_8888:
|
||||||
|
case mir_pixel_format_xrgb_8888:
|
||||||
|
return formats[f];
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return mir_pixel_format_invalid;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_winsys_renderer_disconnect (CoglRenderer *renderer)
|
||||||
|
{
|
||||||
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
CoglRendererMir *mir_renderer = egl_renderer->platform;
|
||||||
|
|
||||||
|
if (egl_renderer->edpy)
|
||||||
|
eglTerminate (egl_renderer->edpy);
|
||||||
|
|
||||||
|
if (mir_connection_is_valid (mir_renderer->mir_connection))
|
||||||
|
mir_connection_release (mir_renderer->mir_connection);
|
||||||
|
|
||||||
|
g_slice_free (CoglRendererMir, egl_renderer->platform);
|
||||||
|
g_slice_free (CoglRendererEGL, egl_renderer);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
_cogl_winsys_renderer_connect (CoglRenderer *renderer,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglRendererEGL *egl_renderer;
|
||||||
|
CoglRendererMir *mir_renderer;
|
||||||
|
MirEGLNativeDisplayType mir_native_dpy;
|
||||||
|
|
||||||
|
renderer->winsys = g_slice_new0 (CoglRendererEGL);
|
||||||
|
egl_renderer = renderer->winsys;
|
||||||
|
mir_renderer = g_slice_new0 (CoglRendererMir);
|
||||||
|
egl_renderer->platform = mir_renderer;
|
||||||
|
|
||||||
|
egl_renderer->platform_vtable = &_cogl_winsys_egl_vtable;
|
||||||
|
|
||||||
|
mir_renderer->mir_connection = mir_connect_sync (NULL, __PRETTY_FUNCTION__);
|
||||||
|
if (!mir_connection_is_valid (mir_renderer->mir_connection))
|
||||||
|
{
|
||||||
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_INIT,
|
||||||
|
"Failed to connect mir display");
|
||||||
|
goto error;
|
||||||
|
}
|
||||||
|
|
||||||
|
mir_native_dpy =
|
||||||
|
mir_connection_get_egl_native_display (mir_renderer->mir_connection);
|
||||||
|
egl_renderer->edpy =
|
||||||
|
eglGetDisplay (mir_native_dpy);
|
||||||
|
|
||||||
|
if (!_cogl_winsys_egl_renderer_connect_common (renderer, error))
|
||||||
|
goto error;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
error:
|
||||||
|
_cogl_winsys_renderer_disconnect (renderer);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
_cogl_winsys_egl_display_setup (CoglDisplay *display,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglDisplayEGL *egl_display = display->winsys;
|
||||||
|
CoglDisplayMir *mir_display;
|
||||||
|
|
||||||
|
mir_display = g_slice_new0 (CoglDisplayMir);
|
||||||
|
egl_display->platform = mir_display;
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_winsys_egl_display_destroy (CoglDisplay *display)
|
||||||
|
{
|
||||||
|
CoglDisplayEGL *egl_display = display->winsys;
|
||||||
|
|
||||||
|
g_slice_free (CoglDisplayMir, egl_display->platform);
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
make_dummy_surface (CoglDisplay *display,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglRenderer *renderer = display->renderer;
|
||||||
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
CoglRendererMir *mir_renderer = egl_renderer->platform;
|
||||||
|
CoglDisplayEGL *egl_display = display->winsys;
|
||||||
|
CoglDisplayMir *mir_display = egl_display->platform;
|
||||||
|
MirEGLNativeWindowType dummy_mir_egl_native_window;
|
||||||
|
MirSurfaceParameters surfaceparm;
|
||||||
|
const char *error_message;
|
||||||
|
|
||||||
|
surfaceparm.name = "CoglDummySurface";
|
||||||
|
surfaceparm.width = 1;
|
||||||
|
surfaceparm.height = 1;
|
||||||
|
surfaceparm.pixel_format = _mir_connection_get_valid_format (mir_renderer->mir_connection);
|
||||||
|
surfaceparm.buffer_usage = mir_buffer_usage_hardware;
|
||||||
|
surfaceparm.output_id = mir_display_output_id_invalid;
|
||||||
|
|
||||||
|
mir_display->dummy_mir_surface =
|
||||||
|
mir_connection_create_surface_sync (mir_renderer->mir_connection, &surfaceparm);
|
||||||
|
if (!mir_display->dummy_mir_surface)
|
||||||
|
{
|
||||||
|
error_message= "Failed to create a dummy mir surface";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
dummy_mir_egl_native_window =
|
||||||
|
mir_surface_get_egl_native_window (mir_display->dummy_mir_surface);
|
||||||
|
if (!dummy_mir_egl_native_window)
|
||||||
|
{
|
||||||
|
error_message= "Failed to get a dummy mir native egl surface";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
egl_display->dummy_surface =
|
||||||
|
eglCreateWindowSurface (egl_renderer->edpy,
|
||||||
|
egl_display->egl_config,
|
||||||
|
(EGLNativeWindowType) dummy_mir_egl_native_window,
|
||||||
|
NULL);
|
||||||
|
if (egl_display->dummy_surface == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
error_message= "Unable to create dummy window surface";
|
||||||
|
goto fail;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
|
||||||
|
fail:
|
||||||
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
||||||
|
"%s", error_message);
|
||||||
|
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
_cogl_winsys_egl_context_created (CoglDisplay *display,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglRenderer *renderer = display->renderer;
|
||||||
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
CoglDisplayEGL *egl_display = display->winsys;
|
||||||
|
|
||||||
|
if ((egl_renderer->private_features &
|
||||||
|
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0 &&
|
||||||
|
!make_dummy_surface(display, error))
|
||||||
|
return FALSE;
|
||||||
|
|
||||||
|
if (!_cogl_winsys_egl_make_current (display,
|
||||||
|
egl_display->dummy_surface,
|
||||||
|
egl_display->dummy_surface,
|
||||||
|
egl_display->egl_context))
|
||||||
|
{
|
||||||
|
_cogl_set_error (error,
|
||||||
|
COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
||||||
|
"%s",
|
||||||
|
"Unable to eglMakeCurrent with dummy surface");
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_winsys_egl_cleanup_context (CoglDisplay *display)
|
||||||
|
{
|
||||||
|
CoglRenderer *renderer = display->renderer;
|
||||||
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
CoglDisplayEGL *egl_display = display->winsys;
|
||||||
|
CoglDisplayMir *mir_display = egl_display->platform;
|
||||||
|
|
||||||
|
if (egl_display->dummy_surface != EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
eglDestroySurface (egl_renderer->edpy, egl_display->dummy_surface);
|
||||||
|
egl_display->dummy_surface = EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mir_display->dummy_mir_surface)
|
||||||
|
{
|
||||||
|
mir_surface_release (mir_display->dummy_mir_surface, NULL, NULL);
|
||||||
|
mir_display->dummy_mir_surface = NULL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
_cogl_winsys_egl_context_init (CoglContext *context,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
COGL_FLAGS_SET (context->features,
|
||||||
|
COGL_FEATURE_ID_ONSCREEN_MULTIPLE, TRUE);
|
||||||
|
COGL_FLAGS_SET (context->winsys_features,
|
||||||
|
COGL_WINSYS_FEATURE_MULTIPLE_ONSCREEN,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static CoglBool
|
||||||
|
_cogl_winsys_egl_onscreen_init (CoglOnscreen *onscreen,
|
||||||
|
EGLConfig egl_config,
|
||||||
|
CoglError **error)
|
||||||
|
{
|
||||||
|
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
|
||||||
|
CoglOnscreenMir *mir_onscreen;
|
||||||
|
CoglFramebuffer *framebuffer = COGL_FRAMEBUFFER (onscreen);
|
||||||
|
CoglContext *context = framebuffer->context;
|
||||||
|
CoglRenderer *renderer = context->display->renderer;
|
||||||
|
CoglRendererEGL *egl_renderer = renderer->winsys;
|
||||||
|
CoglRendererMir *mir_renderer = egl_renderer->platform;
|
||||||
|
MirEGLNativeWindowType mir_egl_native_window;
|
||||||
|
MirSurfaceParameters surfaceparm;
|
||||||
|
|
||||||
|
mir_onscreen = g_slice_new0 (CoglOnscreenMir);
|
||||||
|
egl_onscreen->platform = mir_onscreen;
|
||||||
|
|
||||||
|
surfaceparm.name = "CoglSurface";
|
||||||
|
surfaceparm.width = cogl_framebuffer_get_width (framebuffer);
|
||||||
|
surfaceparm.height = cogl_framebuffer_get_height (framebuffer);
|
||||||
|
surfaceparm.pixel_format = _mir_connection_get_valid_format (mir_renderer->mir_connection);
|
||||||
|
surfaceparm.buffer_usage = mir_buffer_usage_hardware;
|
||||||
|
surfaceparm.output_id = mir_display_output_id_invalid;
|
||||||
|
|
||||||
|
mir_onscreen->mir_surface =
|
||||||
|
mir_connection_create_surface_sync (mir_renderer->mir_connection, &surfaceparm);
|
||||||
|
|
||||||
|
mir_onscreen->last_state = mir_surface_get_state (mir_onscreen->mir_surface);
|
||||||
|
|
||||||
|
if (!mir_surface_is_valid (mir_onscreen->mir_surface))
|
||||||
|
{
|
||||||
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_ONSCREEN,
|
||||||
|
"Error while creating mir surface for CoglOnscreen");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
mir_egl_native_window = mir_surface_get_egl_native_window (mir_onscreen->mir_surface);
|
||||||
|
if (!mir_egl_native_window)
|
||||||
|
{
|
||||||
|
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
||||||
|
COGL_WINSYS_ERROR_CREATE_ONSCREEN,
|
||||||
|
"Error while getting mir egl native window "
|
||||||
|
"for CoglOnscreen");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
egl_onscreen->egl_surface =
|
||||||
|
eglCreateWindowSurface (egl_renderer->edpy,
|
||||||
|
egl_config,
|
||||||
|
(EGLNativeWindowType) mir_egl_native_window,
|
||||||
|
NULL);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_winsys_egl_onscreen_deinit (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
|
||||||
|
CoglOnscreenMir *mir_onscreen = egl_onscreen->platform;
|
||||||
|
|
||||||
|
if (mir_onscreen->mir_surface)
|
||||||
|
{
|
||||||
|
mir_surface_release (mir_onscreen->mir_surface, NULL, NULL);
|
||||||
|
mir_onscreen->mir_surface = NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
mir_onscreen->last_state = mir_surface_state_unknown;
|
||||||
|
|
||||||
|
g_slice_free (CoglOnscreenMir, mir_onscreen);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
_cogl_winsys_onscreen_set_visibility (CoglOnscreen *onscreen,
|
||||||
|
CoglBool visibility)
|
||||||
|
{
|
||||||
|
CoglOnscreenEGL *egl_onscreen = onscreen->winsys;
|
||||||
|
CoglOnscreenMir *mir_onscreen = egl_onscreen->platform;
|
||||||
|
MirSurfaceState new_state, current_state;
|
||||||
|
|
||||||
|
current_state = mir_surface_get_state (mir_onscreen->mir_surface);
|
||||||
|
|
||||||
|
if ((visibility && current_state != mir_surface_state_minimized) ||
|
||||||
|
(!visibility && current_state == mir_surface_state_minimized))
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!visibility)
|
||||||
|
{
|
||||||
|
new_state = mir_surface_state_minimized;
|
||||||
|
mir_onscreen->last_state = current_state;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
new_state = mir_onscreen->last_state;
|
||||||
|
}
|
||||||
|
|
||||||
|
mir_surface_set_state (mir_onscreen->mir_surface, new_state);
|
||||||
|
}
|
||||||
|
|
||||||
|
MirSurface *
|
||||||
|
cogl_mir_onscreen_get_surface (CoglOnscreen *onscreen)
|
||||||
|
{
|
||||||
|
CoglOnscreenEGL *egl_onscreen;
|
||||||
|
CoglOnscreenMir *mir_onscreen;
|
||||||
|
|
||||||
|
cogl_framebuffer_allocate (COGL_FRAMEBUFFER (onscreen), NULL);
|
||||||
|
|
||||||
|
egl_onscreen = onscreen->winsys;
|
||||||
|
mir_onscreen = egl_onscreen->platform;
|
||||||
|
|
||||||
|
return mir_onscreen->mir_surface;
|
||||||
|
}
|
||||||
|
|
||||||
|
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,
|
||||||
|
.context_init = _cogl_winsys_egl_context_init,
|
||||||
|
.onscreen_init = _cogl_winsys_egl_onscreen_init,
|
||||||
|
.onscreen_deinit = _cogl_winsys_egl_onscreen_deinit
|
||||||
|
};
|
||||||
|
|
||||||
|
const CoglWinsysVtable *
|
||||||
|
_cogl_winsys_egl_mir_get_vtable (void)
|
||||||
|
{
|
||||||
|
static CoglBool vtable_inited = FALSE;
|
||||||
|
static CoglWinsysVtable vtable;
|
||||||
|
|
||||||
|
if (!vtable_inited)
|
||||||
|
{
|
||||||
|
/* The EGL_MIR winsys is a subclass of the EGL winsys so we
|
||||||
|
start by copying its vtable */
|
||||||
|
|
||||||
|
parent_vtable = _cogl_winsys_egl_get_vtable ();
|
||||||
|
vtable = *parent_vtable;
|
||||||
|
|
||||||
|
vtable.id = COGL_WINSYS_ID_EGL_MIR;
|
||||||
|
vtable.name = "EGL_MIR";
|
||||||
|
|
||||||
|
vtable.renderer_connect = _cogl_winsys_renderer_connect;
|
||||||
|
vtable.renderer_disconnect = _cogl_winsys_renderer_disconnect;
|
||||||
|
|
||||||
|
vtable.onscreen_set_visibility =
|
||||||
|
_cogl_winsys_onscreen_set_visibility;
|
||||||
|
|
||||||
|
vtable_inited = TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return &vtable;
|
||||||
|
}
|
25
configure.ac
25
configure.ac
@ -97,6 +97,7 @@ m4_define([xrandr_req_version], [1.2])
|
|||||||
m4_define([cairo_req_version], [1.10])
|
m4_define([cairo_req_version], [1.10])
|
||||||
m4_define([wayland_req_version], [1.0.0])
|
m4_define([wayland_req_version], [1.0.0])
|
||||||
m4_define([wayland_server_req_version], [1.1.90])
|
m4_define([wayland_server_req_version], [1.1.90])
|
||||||
|
m4_define([mirclient_req_version], [0.9.0])
|
||||||
|
|
||||||
dnl These variables get copied into the generated README
|
dnl These variables get copied into the generated README
|
||||||
AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])
|
AC_SUBST([GLIB_REQ_VERSION], [glib_req_version])
|
||||||
@ -110,6 +111,7 @@ AC_SUBST([GI_REQ_VERSION], [gi_req_version])
|
|||||||
AC_SUBST([UPROF_REQ_VERSION], [uprof_req_version])
|
AC_SUBST([UPROF_REQ_VERSION], [uprof_req_version])
|
||||||
AC_SUBST([WAYLAND_REQ_VERSION], [wayland_req_version])
|
AC_SUBST([WAYLAND_REQ_VERSION], [wayland_req_version])
|
||||||
AC_SUBST([WAYLAND_SERVER_REQ_VERSION], [wayland_server_req_version])
|
AC_SUBST([WAYLAND_SERVER_REQ_VERSION], [wayland_server_req_version])
|
||||||
|
AC_SUBST([MIRCLIENT_REQ_VERSION], [mirclient_req_version])
|
||||||
|
|
||||||
# Save this value here, since automake will set cflags later and we
|
# Save this value here, since automake will set cflags later and we
|
||||||
# want to know if the user specified custom cflags or not.
|
# want to know if the user specified custom cflags or not.
|
||||||
@ -1151,6 +1153,29 @@ AS_IF([test "x$enable_android_egl_platform" = "xyes"],
|
|||||||
AM_CONDITIONAL(SUPPORT_EGL_PLATFORM_ANDROID,
|
AM_CONDITIONAL(SUPPORT_EGL_PLATFORM_ANDROID,
|
||||||
[test "x$enable_android_egl_platform" = "xyes"])
|
[test "x$enable_android_egl_platform" = "xyes"])
|
||||||
|
|
||||||
|
|
||||||
|
dnl Mir EGL platform
|
||||||
|
AC_ARG_ENABLE(
|
||||||
|
[mir-egl-platform],
|
||||||
|
[AC_HELP_STRING([--enable-mir-egl-platform=@<:@no/yes@:>@], [Enable support for the Mir egl platform @<:@default=no@:>@])],
|
||||||
|
[],
|
||||||
|
enable_mir_egl_platform=no
|
||||||
|
)
|
||||||
|
AS_IF([test "x$enable_mir_egl_platform" = "xyes"],
|
||||||
|
[
|
||||||
|
EGL_PLATFORM_COUNT=$((EGL_PLATFORM_COUNT+1))
|
||||||
|
NEED_EGL=yes
|
||||||
|
EGL_PLATFORMS="$EGL_PLATFORMS mir"
|
||||||
|
|
||||||
|
PKG_CHECK_MODULES(MIR_CLIENT,
|
||||||
|
[mirclient >= mirclient_req_version])
|
||||||
|
COGL_PKG_REQUIRES="$COGL_PKG_REQUIRES mirclient >= mirclient_req_version"
|
||||||
|
|
||||||
|
COGL_DEFINES_SYMBOLS="$COGL_DEFINES_SYMBOLS COGL_HAS_EGL_PLATFORM_MIR_SUPPORT"
|
||||||
|
])
|
||||||
|
AM_CONDITIONAL(SUPPORT_EGL_PLATFORM_MIR,
|
||||||
|
[test "x$enable_mir_egl_platform" = "xyes"])
|
||||||
|
|
||||||
dnl This should go last, since it's the default fallback and we need
|
dnl This should go last, since it's the default fallback and we need
|
||||||
dnl to check the value of $EGL_PLATFORM_COUNT here.
|
dnl to check the value of $EGL_PLATFORM_COUNT here.
|
||||||
AC_ARG_ENABLE(
|
AC_ARG_ENABLE(
|
||||||
|
@ -147,6 +147,8 @@ get_winsys_name_for_id (CoglWinsysID winsys_id)
|
|||||||
return "EGL + KMS platform";
|
return "EGL + KMS platform";
|
||||||
case COGL_WINSYS_ID_EGL_ANDROID:
|
case COGL_WINSYS_ID_EGL_ANDROID:
|
||||||
return "EGL + Android platform";
|
return "EGL + Android platform";
|
||||||
|
case COGL_WINSYS_ID_EGL_MIR:
|
||||||
|
return "EGL + Mir platform";
|
||||||
case COGL_WINSYS_ID_WGL:
|
case COGL_WINSYS_ID_WGL:
|
||||||
return "EGL + Windows WGL platform";
|
return "EGL + Windows WGL platform";
|
||||||
case COGL_WINSYS_ID_SDL:
|
case COGL_WINSYS_ID_SDL:
|
||||||
|
Loading…
Reference in New Issue
Block a user