mirror of
https://github.com/brl/mutter.git
synced 2025-03-23 11:43:50 +00:00
renderer-native: Always use MetaEgl when interacting with EGL
Partly for consistency, partly for error handling functionality. https://bugzilla.gnome.org/show_bug.cgi?id=785381
This commit is contained in:
parent
18eb66de06
commit
b0e42d3f6e
@ -290,6 +290,27 @@ meta_egl_choose_config (MetaEgl *egl,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
EGLSurface
|
||||||
|
meta_egl_create_window_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
EGLNativeWindowType native_window_type,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
EGLSurface surface;
|
||||||
|
|
||||||
|
surface = eglCreateWindowSurface (display, config,
|
||||||
|
native_window_type, attrib_list);
|
||||||
|
if (surface == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
set_egl_error (error);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
EGLSurface
|
EGLSurface
|
||||||
meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||||
EGLDisplay display,
|
EGLDisplay display,
|
||||||
@ -309,6 +330,21 @@ meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
|||||||
return surface;
|
return surface;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_egl_destroy_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLSurface surface,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
if (!eglDestroySurface (display, surface))
|
||||||
|
{
|
||||||
|
set_egl_error (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
is_egl_proc_valid_real (void *proc,
|
is_egl_proc_valid_real (void *proc,
|
||||||
const char *proc_name,
|
const char *proc_name,
|
||||||
@ -353,6 +389,20 @@ meta_egl_get_platform_display (MetaEgl *egl,
|
|||||||
return display;
|
return display;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_egl_terminate (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
if (!eglTerminate (display))
|
||||||
|
{
|
||||||
|
set_egl_error (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
EGLImageKHR
|
EGLImageKHR
|
||||||
meta_egl_create_image (MetaEgl *egl,
|
meta_egl_create_image (MetaEgl *egl,
|
||||||
EGLDisplay display,
|
EGLDisplay display,
|
||||||
|
@ -71,18 +71,34 @@ gboolean meta_egl_destroy_image (MetaEgl *egl,
|
|||||||
EGLImageKHR image,
|
EGLImageKHR image,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
EGLSurface meta_egl_create_window_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
EGLNativeWindowType native_window_type,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
EGLSurface meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
EGLSurface meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||||
EGLDisplay display,
|
EGLDisplay display,
|
||||||
EGLConfig config,
|
EGLConfig config,
|
||||||
const EGLint *attrib_list,
|
const EGLint *attrib_list,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
gboolean meta_egl_destroy_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLSurface surface,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
EGLDisplay meta_egl_get_platform_display (MetaEgl *egl,
|
EGLDisplay meta_egl_get_platform_display (MetaEgl *egl,
|
||||||
EGLenum platform,
|
EGLenum platform,
|
||||||
void *native_display,
|
void *native_display,
|
||||||
const EGLint *attrib_list,
|
const EGLint *attrib_list,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
gboolean meta_egl_terminate (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
gboolean meta_egl_query_wayland_buffer (MetaEgl *egl,
|
gboolean meta_egl_query_wayland_buffer (MetaEgl *egl,
|
||||||
EGLDisplay display,
|
EGLDisplay display,
|
||||||
struct wl_resource *buffer,
|
struct wl_resource *buffer,
|
||||||
|
@ -242,9 +242,11 @@ static void
|
|||||||
meta_renderer_native_disconnect (CoglRenderer *cogl_renderer)
|
meta_renderer_native_disconnect (CoglRenderer *cogl_renderer)
|
||||||
{
|
{
|
||||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
|
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
||||||
|
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||||
|
|
||||||
if (cogl_renderer_egl->edpy != EGL_NO_DISPLAY)
|
if (cogl_renderer_egl->edpy != EGL_NO_DISPLAY)
|
||||||
eglTerminate (cogl_renderer_egl->edpy);
|
meta_egl_terminate (egl, cogl_renderer_egl->edpy, NULL);
|
||||||
|
|
||||||
g_slice_free (CoglRendererEGL, cogl_renderer_egl);
|
g_slice_free (CoglRendererEGL, cogl_renderer_egl);
|
||||||
}
|
}
|
||||||
@ -516,10 +518,15 @@ meta_renderer_native_egl_cleanup_context (CoglDisplay *cogl_display)
|
|||||||
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
|
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
|
||||||
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
||||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
|
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
||||||
|
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||||
|
|
||||||
if (cogl_display_egl->dummy_surface != EGL_NO_SURFACE)
|
if (cogl_display_egl->dummy_surface != EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
eglDestroySurface (cogl_renderer_egl->edpy, cogl_display_egl->dummy_surface);
|
meta_egl_destroy_surface (egl,
|
||||||
|
cogl_renderer_egl->edpy,
|
||||||
|
cogl_display_egl->dummy_surface,
|
||||||
|
NULL);
|
||||||
cogl_display_egl->dummy_surface = EGL_NO_SURFACE;
|
cogl_display_egl->dummy_surface = EGL_NO_SURFACE;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@ -1062,6 +1069,7 @@ meta_renderer_native_create_surface_gbm (MetaOnscreenNative *onscreen_native,
|
|||||||
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
|
CoglDisplayEGL *cogl_display_egl = cogl_display->winsys;
|
||||||
CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_display->renderer->winsys;
|
||||||
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
||||||
|
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||||
struct gbm_surface *new_gbm_surface;
|
struct gbm_surface *new_gbm_surface;
|
||||||
EGLNativeWindowType egl_native_window;
|
EGLNativeWindowType egl_native_window;
|
||||||
@ -1085,16 +1093,16 @@ meta_renderer_native_create_surface_gbm (MetaOnscreenNative *onscreen_native,
|
|||||||
}
|
}
|
||||||
|
|
||||||
egl_native_window = (EGLNativeWindowType) new_gbm_surface;
|
egl_native_window = (EGLNativeWindowType) new_gbm_surface;
|
||||||
new_egl_surface = eglCreateWindowSurface (cogl_renderer_egl->edpy,
|
new_egl_surface =
|
||||||
cogl_display_egl->egl_config,
|
meta_egl_create_window_surface (egl,
|
||||||
egl_native_window,
|
cogl_renderer_egl->edpy,
|
||||||
NULL);
|
cogl_display_egl->egl_config,
|
||||||
|
egl_native_window,
|
||||||
|
NULL,
|
||||||
|
error);
|
||||||
if (new_egl_surface == EGL_NO_SURFACE)
|
if (new_egl_surface == EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
gbm_surface_destroy (new_gbm_surface);
|
gbm_surface_destroy (new_gbm_surface);
|
||||||
g_set_error (error, COGL_WINSYS_ERROR,
|
|
||||||
COGL_WINSYS_ERROR_CREATE_ONSCREEN,
|
|
||||||
"Failed to allocate surface");
|
|
||||||
return FALSE;
|
return FALSE;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -1458,8 +1466,9 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
|||||||
CoglContext *cogl_context = framebuffer->context;
|
CoglContext *cogl_context = framebuffer->context;
|
||||||
CoglRenderer *cogl_renderer = cogl_context->display->renderer;
|
CoglRenderer *cogl_renderer = cogl_context->display->renderer;
|
||||||
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
CoglRendererEGL *cogl_renderer_egl = cogl_renderer->winsys;
|
||||||
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
|
||||||
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
MetaRendererNative *renderer_native = cogl_renderer_egl->platform;
|
||||||
|
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||||
|
CoglOnscreenEGL *onscreen_egl = onscreen->winsys;
|
||||||
MetaOnscreenNative *onscreen_native;
|
MetaOnscreenNative *onscreen_native;
|
||||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||||
|
|
||||||
@ -1471,7 +1480,10 @@ meta_renderer_native_release_onscreen (CoglOnscreen *onscreen)
|
|||||||
|
|
||||||
if (onscreen_egl->egl_surface != EGL_NO_SURFACE)
|
if (onscreen_egl->egl_surface != EGL_NO_SURFACE)
|
||||||
{
|
{
|
||||||
eglDestroySurface (cogl_renderer_egl->edpy, onscreen_egl->egl_surface);
|
meta_egl_destroy_surface (egl,
|
||||||
|
cogl_renderer_egl->edpy,
|
||||||
|
onscreen_egl->egl_surface,
|
||||||
|
NULL);
|
||||||
onscreen_egl->egl_surface = EGL_NO_SURFACE;
|
onscreen_egl->egl_surface = EGL_NO_SURFACE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user