mirror of
https://github.com/brl/mutter.git
synced 2025-02-16 13:24:09 +00:00
wip! renderer/native: separate renderer gpu data initialization from creation
We're going to need to initialize both gbm and egldevice based rendering on some machines for one renderer data, so this commit splits initialization out from construction.
This commit is contained in:
parent
3dacd0f6f5
commit
b61c2f2120
@ -3243,17 +3243,17 @@ init_secondary_gpu_data (MetaRendererNativeGpuData *renderer_gpu_data)
|
||||
init_secondary_gpu_data_cpu (renderer_gpu_data);
|
||||
}
|
||||
|
||||
static MetaRendererNativeGpuData *
|
||||
create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
static gboolean
|
||||
init_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
MetaRendererNativeGpuData *renderer_gpu_data,
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
MetaMonitorManagerKms *monitor_manager_kms;
|
||||
MetaEgl *egl = meta_renderer_native_get_egl (renderer_native);
|
||||
struct gbm_device *gbm_device;
|
||||
EGLDisplay egl_display;
|
||||
int kms_fd;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
MetaGpuKms *primary_gpu;
|
||||
|
||||
if (!meta_egl_has_extensions (egl, EGL_NO_DISPLAY, NULL,
|
||||
@ -3266,7 +3266,7 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"Missing extension for GBM renderer: EGL_KHR_platform_gbm");
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
kms_fd = meta_gpu_kms_get_fd (gpu_kms);
|
||||
@ -3277,7 +3277,7 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"Failed to create gbm device: %s", g_strerror (errno));
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
egl_display = meta_egl_get_platform_display (egl,
|
||||
@ -3286,13 +3286,12 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
if (egl_display == EGL_NO_DISPLAY)
|
||||
{
|
||||
gbm_device_destroy (gbm_device);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
if (!meta_egl_initialize (egl, egl_display, error))
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);
|
||||
renderer_gpu_data->renderer_native = renderer_native;
|
||||
renderer_gpu_data->gbm.device = gbm_device;
|
||||
renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_GBM;
|
||||
@ -3301,9 +3300,9 @@ create_renderer_gpu_data_gbm (MetaRendererNative *renderer_native,
|
||||
monitor_manager_kms = renderer_native->monitor_manager_kms;
|
||||
primary_gpu = meta_monitor_manager_kms_get_primary_gpu (monitor_manager_kms);
|
||||
if (gpu_kms != primary_gpu)
|
||||
init_secondary_gpu_data (renderer_gpu_data);
|
||||
renderer_gpu_data->secondary.mode = META_RENDERER_NATIVE_MODE_GBM;
|
||||
|
||||
return renderer_gpu_data;
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
@ -3422,10 +3421,11 @@ get_egl_device_display (MetaRendererNative *renderer_native,
|
||||
error);
|
||||
}
|
||||
|
||||
static MetaRendererNativeGpuData *
|
||||
create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
static gboolean
|
||||
init_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
|
||||
MetaRendererNativeGpuData *renderer_gpu_data,
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
MetaMonitorManagerKms *monitor_manager_kms =
|
||||
renderer_native->monitor_manager_kms;
|
||||
@ -3434,14 +3434,13 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
|
||||
char **missing_extensions;
|
||||
EGLDeviceEXT egl_device;
|
||||
EGLDisplay egl_display;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
|
||||
if (!meta_is_stage_views_enabled())
|
||||
{
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"EGLDevice requires stage views enabled");
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
primary_gpu = meta_monitor_manager_kms_get_primary_gpu (monitor_manager_kms);
|
||||
@ -3450,20 +3449,20 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
|
||||
g_set_error (error, G_IO_ERROR,
|
||||
G_IO_ERROR_FAILED,
|
||||
"EGLDevice currently only works with single GPU systems");
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
egl_device = find_egl_device (renderer_native, gpu_kms, error);
|
||||
if (egl_device == EGL_NO_DEVICE_EXT)
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
egl_display = get_egl_device_display (renderer_native, gpu_kms,
|
||||
egl_device, error);
|
||||
if (egl_display == EGL_NO_DISPLAY)
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
if (!meta_egl_initialize (egl, egl_display, error))
|
||||
return NULL;
|
||||
return FALSE;
|
||||
|
||||
if (!meta_egl_has_extensions (egl,
|
||||
egl_display,
|
||||
@ -3486,16 +3485,15 @@ create_renderer_gpu_data_egl_device (MetaRendererNative *renderer_native,
|
||||
missing_extensions_str);
|
||||
g_free (missing_extensions_str);
|
||||
g_free (missing_extensions);
|
||||
return NULL;
|
||||
return FALSE;
|
||||
}
|
||||
|
||||
renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);
|
||||
renderer_gpu_data->renderer_native = renderer_native;
|
||||
renderer_gpu_data->egl.device = egl_device;
|
||||
renderer_gpu_data->mode = META_RENDERER_NATIVE_MODE_EGL_DEVICE;
|
||||
renderer_gpu_data->egl_display = egl_display;
|
||||
|
||||
return renderer_gpu_data;
|
||||
return TRUE;
|
||||
}
|
||||
#endif /* HAVE_EGL_DEVICE */
|
||||
|
||||
@ -3504,33 +3502,48 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
MetaGpuKms *gpu_kms,
|
||||
GError **error)
|
||||
{
|
||||
MetaRendererNativeGpuData *renderer_gpu_data;
|
||||
MetaRendererNativeGpuData *renderer_gpu_data = NULL;
|
||||
gboolean initialized;
|
||||
GError *gbm_error = NULL;
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
GError *egl_device_error = NULL;
|
||||
#endif
|
||||
|
||||
renderer_gpu_data = meta_create_renderer_native_gpu_data (gpu_kms);
|
||||
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
/* Try to initialize the EGLDevice backend first. Whenever we use a
|
||||
* non-NVIDIA GPU, the EGLDevice enumeration function won't find a match, and
|
||||
* we'll fall back to GBM (which will always succeed as it has a software
|
||||
* rendering fallback)
|
||||
*/
|
||||
renderer_gpu_data = create_renderer_gpu_data_egl_device (renderer_native,
|
||||
gpu_kms,
|
||||
&egl_device_error);
|
||||
if (renderer_gpu_data)
|
||||
initialized = init_renderer_gpu_data_egl_device (renderer_native,
|
||||
renderer_gpu_data,
|
||||
gpu_kms,
|
||||
&egl_device_error);
|
||||
if (initialized)
|
||||
return renderer_gpu_data;
|
||||
#endif
|
||||
|
||||
renderer_gpu_data = create_renderer_gpu_data_gbm (renderer_native,
|
||||
gpu_kms,
|
||||
&gbm_error);
|
||||
if (renderer_gpu_data)
|
||||
initialized = init_renderer_gpu_data_gbm (renderer_native,
|
||||
renderer_gpu_data,
|
||||
gpu_kms,
|
||||
&gbm_error);
|
||||
if (initialized)
|
||||
{
|
||||
MetaMonitorManagerKms *monitor_manager_kms;
|
||||
MetaGpuKms *primary_gpu;
|
||||
|
||||
#ifdef HAVE_EGL_DEVICE
|
||||
g_error_free (egl_device_error);
|
||||
#endif
|
||||
|
||||
monitor_manager_kms = renderer_native->monitor_manager_kms;
|
||||
primary_gpu = meta_monitor_manager_kms_get_primary_gpu (monitor_manager_kms);
|
||||
|
||||
if (gpu_kms != primary_gpu)
|
||||
init_secondary_gpu_data (renderer_gpu_data);
|
||||
|
||||
return renderer_gpu_data;
|
||||
}
|
||||
|
||||
@ -3552,6 +3565,8 @@ meta_renderer_native_create_renderer_gpu_data (MetaRendererNative *renderer_nat
|
||||
g_error_free (egl_device_error);
|
||||
#endif
|
||||
|
||||
meta_renderer_native_gpu_data_free (renderer_gpu_data);
|
||||
|
||||
return NULL;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user