[mutter/wip/3-monitors-on-nvidia: 214/221] wip! renderer/native: separate renderer gpu data initialization from creation



commit 29cea69200f0a14d03cae623b87006bb894a7eee
Author: Ray Strode <rstrode redhat com>
Date:   Thu Sep 13 07:58:29 2018 -0400

    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.

 src/backends/native/meta-renderer-native.c | 83 ++++++++++++++++++------------
 1 file changed, 49 insertions(+), 34 deletions(-)
---
diff --git a/src/backends/native/meta-renderer-native.c b/src/backends/native/meta-renderer-native.c
index 62a7512a4..1f3007817 100644
--- a/src/backends/native/meta-renderer-native.c
+++ b/src/backends/native/meta-renderer-native.c
@@ -3241,17 +3241,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,
@@ -3264,7 +3264,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);
@@ -3275,7 +3275,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,
@@ -3284,13 +3284,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;
@@ -3299,9 +3298,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
@@ -3420,10 +3419,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;
@@ -3432,14 +3432,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);
@@ -3448,20 +3447,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,
@@ -3484,16 +3483,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 */
 
@@ -3502,33 +3500,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;
     }
 
@@ -3550,6 +3563,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;
 }
 


[Date Prev][Date Next]   [Thread Prev][Thread Next]   [Thread Index] [Date Index] [Author Index]