mirror of
https://github.com/brl/mutter.git
synced 2024-11-26 01:50:42 -05:00
MetaRendererNative: Use pbuffer surface as dummy surface
Lets use a pbuffer surface as a dummy surface instead of a gbm based one, so that we don't need to rely on the availability of gbm to create a dummy surface when there is no need for it. https://bugzilla.gnome.org/show_bug.cgi?id=773629
This commit is contained in:
parent
f7cd6af9c6
commit
da1c1d9c22
@ -200,6 +200,69 @@ meta_egl_get_display (MetaEgl *egl,
|
|||||||
return display;
|
return display;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_egl_choose_config (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
EGLConfig *chosen_config,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
EGLint num_configs;
|
||||||
|
EGLConfig *configs;
|
||||||
|
EGLint num_matches;
|
||||||
|
|
||||||
|
if (!eglGetConfigs (display, NULL, 0, &num_configs))
|
||||||
|
{
|
||||||
|
set_egl_error (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (num_configs < 1)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR,
|
||||||
|
G_IO_ERROR_FAILED,
|
||||||
|
"No EGL configurations available");
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
configs = g_new0 (EGLConfig, num_configs);
|
||||||
|
|
||||||
|
if (!eglChooseConfig (display, attrib_list, configs, num_configs, &num_matches))
|
||||||
|
{
|
||||||
|
g_free (configs);
|
||||||
|
set_egl_error (error);
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* We don't have any preference specified yet, so lets choose the first one.
|
||||||
|
*/
|
||||||
|
*chosen_config = configs[0];
|
||||||
|
|
||||||
|
g_free (configs);
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
|
EGLSurface
|
||||||
|
meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
EGLSurface surface;
|
||||||
|
|
||||||
|
surface = eglCreatePbufferSurface (display, config, attrib_list);
|
||||||
|
if (surface == EGL_NO_SURFACE)
|
||||||
|
{
|
||||||
|
set_egl_error (error);
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return surface;
|
||||||
|
}
|
||||||
|
|
||||||
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,
|
||||||
|
@ -42,6 +42,18 @@ EGLDisplay meta_egl_get_display (MetaEgl *egl,
|
|||||||
EGLNativeDisplayType display_id,
|
EGLNativeDisplayType display_id,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
gboolean meta_egl_choose_config (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
EGLConfig *chosen_config,
|
||||||
|
GError **error);
|
||||||
|
|
||||||
|
EGLSurface meta_egl_create_pbuffer_surface (MetaEgl *egl,
|
||||||
|
EGLDisplay display,
|
||||||
|
EGLConfig config,
|
||||||
|
const EGLint *attrib_list,
|
||||||
|
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,
|
||||||
|
@ -95,8 +95,6 @@ struct _MetaRendererNative
|
|||||||
CoglClosure *swap_notify_idle;
|
CoglClosure *swap_notify_idle;
|
||||||
|
|
||||||
int64_t frame_counter;
|
int64_t frame_counter;
|
||||||
|
|
||||||
struct gbm_surface *dummy_gbm_surface;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -281,6 +279,37 @@ meta_renderer_native_destroy_egl_display (CoglDisplay *cogl_display)
|
|||||||
{
|
{
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static EGLSurface
|
||||||
|
create_dummy_pbuffer_surface (EGLDisplay egl_display,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
MetaBackend *backend = meta_get_backend ();
|
||||||
|
MetaEgl *egl = meta_backend_get_egl (backend);
|
||||||
|
EGLConfig pbuffer_config;
|
||||||
|
static const EGLint pbuffer_config_attribs[] = {
|
||||||
|
EGL_SURFACE_TYPE, EGL_PBUFFER_BIT,
|
||||||
|
EGL_RED_SIZE, 1,
|
||||||
|
EGL_GREEN_SIZE, 1,
|
||||||
|
EGL_BLUE_SIZE, 1,
|
||||||
|
EGL_ALPHA_SIZE, 0,
|
||||||
|
EGL_RENDERABLE_TYPE, EGL_OPENGL_ES2_BIT,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
static const EGLint pbuffer_attribs[] = {
|
||||||
|
EGL_WIDTH, 16,
|
||||||
|
EGL_HEIGHT, 16,
|
||||||
|
EGL_NONE
|
||||||
|
};
|
||||||
|
|
||||||
|
if (!meta_egl_choose_config (egl, egl_display, pbuffer_config_attribs,
|
||||||
|
&pbuffer_config, error))
|
||||||
|
return EGL_NO_SURFACE;
|
||||||
|
|
||||||
|
return meta_egl_create_pbuffer_surface (egl, egl_display,
|
||||||
|
pbuffer_config, pbuffer_attribs,
|
||||||
|
error);
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
|
meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
|
||||||
GError **error)
|
GError **error)
|
||||||
@ -288,37 +317,14 @@ meta_renderer_native_egl_context_created (CoglDisplay *cogl_display,
|
|||||||
CoglDisplayEGL *egl_display = cogl_display->winsys;
|
CoglDisplayEGL *egl_display = cogl_display->winsys;
|
||||||
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
CoglRenderer *cogl_renderer = cogl_display->renderer;
|
||||||
CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
|
CoglRendererEGL *egl_renderer = cogl_renderer->winsys;
|
||||||
MetaRendererNative *renderer_native = egl_renderer->platform;
|
|
||||||
|
|
||||||
if ((egl_renderer->private_features &
|
if ((egl_renderer->private_features &
|
||||||
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0)
|
COGL_EGL_WINSYS_FEATURE_SURFACELESS_CONTEXT) == 0)
|
||||||
{
|
{
|
||||||
renderer_native->dummy_gbm_surface =
|
|
||||||
gbm_surface_create (renderer_native->gbm.device,
|
|
||||||
16, 16,
|
|
||||||
GBM_FORMAT_XRGB8888,
|
|
||||||
GBM_BO_USE_RENDERING);
|
|
||||||
if (!renderer_native->dummy_gbm_surface)
|
|
||||||
{
|
|
||||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
|
||||||
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
|
||||||
"Failed to create dummy GBM surface");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
|
|
||||||
egl_display->dummy_surface =
|
egl_display->dummy_surface =
|
||||||
eglCreateWindowSurface (egl_renderer->edpy,
|
create_dummy_pbuffer_surface (egl_renderer->edpy, error);
|
||||||
egl_display->egl_config,
|
|
||||||
(EGLNativeWindowType)
|
|
||||||
renderer_native->dummy_gbm_surface,
|
|
||||||
NULL);
|
|
||||||
if (egl_display->dummy_surface == EGL_NO_SURFACE)
|
if (egl_display->dummy_surface == EGL_NO_SURFACE)
|
||||||
{
|
return FALSE;
|
||||||
_cogl_set_error (error, COGL_WINSYS_ERROR,
|
|
||||||
COGL_WINSYS_ERROR_CREATE_CONTEXT,
|
|
||||||
"Failed to create dummy EGL surface");
|
|
||||||
return FALSE;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!_cogl_winsys_egl_make_current (cogl_display,
|
if (!_cogl_winsys_egl_make_current (cogl_display,
|
||||||
@ -1228,7 +1234,6 @@ meta_renderer_native_finalize (GObject *object)
|
|||||||
{
|
{
|
||||||
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
|
MetaRendererNative *renderer_native = META_RENDERER_NATIVE (object);
|
||||||
|
|
||||||
g_clear_pointer (&renderer_native->dummy_gbm_surface, gbm_surface_destroy);
|
|
||||||
g_clear_pointer (&renderer_native->gbm.device, gbm_device_destroy);
|
g_clear_pointer (&renderer_native->gbm.device, gbm_device_destroy);
|
||||||
|
|
||||||
G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object);
|
G_OBJECT_CLASS (meta_renderer_native_parent_class)->finalize (object);
|
||||||
|
Loading…
Reference in New Issue
Block a user