[mutter] kms/impl-device: Make the actual implementation handle the drm event



commit c0e9a6fe1591a6fee1124d1acbaa8d884485eba6
Author: Jonas Ã…dahl <jadahl gmail com>
Date:   Fri Oct 2 16:56:10 2020 +0200

    kms/impl-device: Make the actual implementation handle the drm event
    
    The way drm events are handled depends on whether we're using atomic or
    not. Lets move the handling to the implementation, so that later the
    atomic backend can handle the event they it need to.
    
    Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>

 src/backends/native/meta-kms-impl-device-simple.c | 27 +++++++++++++++++++++++
 src/backends/native/meta-kms-impl-device.c        | 27 +++--------------------
 src/backends/native/meta-kms-impl-device.h        | 13 +++++++++++
 3 files changed, 43 insertions(+), 24 deletions(-)
---
diff --git a/src/backends/native/meta-kms-impl-device-simple.c 
b/src/backends/native/meta-kms-impl-device-simple.c
index 7a7b33a4ab..17f5fdc163 100644
--- a/src/backends/native/meta-kms-impl-device-simple.c
+++ b/src/backends/native/meta-kms-impl-device-simple.c
@@ -1072,6 +1072,31 @@ process_plane_assignments (MetaKmsImplDevice  *impl_device,
   return TRUE;
 }
 
+static void
+page_flip_handler (int           fd,
+                   unsigned int  sequence,
+                   unsigned int  tv_sec,
+                   unsigned int  tv_usec,
+                   void         *user_data)
+{
+  MetaKmsPageFlipData *page_flip_data = user_data;
+  MetaKmsImplDevice *impl_device;
+
+  meta_kms_page_flip_data_set_timings_in_impl (page_flip_data,
+                                               sequence, tv_sec, tv_usec);
+
+  impl_device = meta_kms_page_flip_data_get_impl_device (page_flip_data);
+  meta_kms_impl_device_handle_page_flip_callback (impl_device, page_flip_data);
+}
+
+static void
+meta_kms_impl_device_simple_setup_drm_event_context (MetaKmsImplDevice *impl,
+                                                     drmEventContext   *drm_event_context)
+{
+  drm_event_context->version = 2;
+  drm_event_context->page_flip_handler = page_flip_handler;
+}
+
 static MetaKmsFeedback *
 meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
                                             MetaKmsUpdate     *update)
@@ -1249,6 +1274,8 @@ meta_kms_impl_device_simple_class_init (MetaKmsImplDeviceSimpleClass *klass)
 
   object_class->finalize = meta_kms_impl_device_simple_finalize;
 
+  impl_device_class->setup_drm_event_context =
+    meta_kms_impl_device_simple_setup_drm_event_context;
   impl_device_class->process_update =
     meta_kms_impl_device_simple_process_update;
   impl_device_class->handle_page_flip_callback =
diff --git a/src/backends/native/meta-kms-impl-device.c b/src/backends/native/meta-kms-impl-device.c
index 1385e06762..d944b6c076 100644
--- a/src/backends/native/meta-kms-impl-device.c
+++ b/src/backends/native/meta-kms-impl-device.c
@@ -84,10 +84,6 @@ G_DEFINE_TYPE_WITH_CODE (MetaKmsImplDevice, meta_kms_impl_device,
                          G_IMPLEMENT_INTERFACE (G_TYPE_INITABLE,
                                                 initable_iface_init))
 
-static void
-meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice   *impl_device,
-                                                MetaKmsPageFlipData *page_flip_data);
-
 MetaKmsDevice *
 meta_kms_impl_device_get_device (MetaKmsImplDevice *impl_device)
 {
@@ -169,37 +165,20 @@ meta_kms_impl_device_get_path (MetaKmsImplDevice *impl_device)
   return priv->path;
 }
 
-static void
-page_flip_handler (int           fd,
-                   unsigned int  sequence,
-                   unsigned int  sec,
-                   unsigned int  usec,
-                   void         *user_data)
-{
-  MetaKmsPageFlipData *page_flip_data = user_data;
-  MetaKmsImplDevice *impl_device;
-
-  meta_kms_page_flip_data_set_timings_in_impl (page_flip_data,
-                                               sequence, sec, usec);
-
-  impl_device = meta_kms_page_flip_data_get_impl_device (page_flip_data);
-  meta_kms_impl_device_handle_page_flip_callback (impl_device, page_flip_data);
-}
-
 gboolean
 meta_kms_impl_device_dispatch (MetaKmsImplDevice  *impl_device,
                                GError            **error)
 {
   MetaKmsImplDevicePrivate *priv =
     meta_kms_impl_device_get_instance_private (impl_device);
+  MetaKmsImplDeviceClass *klass = META_KMS_IMPL_DEVICE_GET_CLASS (impl_device);
 
   drmEventContext drm_event_context;
 
   meta_assert_in_kms_impl (meta_kms_impl_get_kms (priv->impl));
 
   drm_event_context = (drmEventContext) { 0 };
-  drm_event_context.version = 2;
-  drm_event_context.page_flip_handler = page_flip_handler;
+  klass->setup_drm_event_context (impl_device, &drm_event_context);
 
   while (TRUE)
     {
@@ -652,7 +631,7 @@ meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
   return klass->process_update (impl_device, update);
 }
 
-static void
+void
 meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice   *impl_device,
                                                 MetaKmsPageFlipData *page_flip_data)
 {
diff --git a/src/backends/native/meta-kms-impl-device.h b/src/backends/native/meta-kms-impl-device.h
index 3740ebad4f..c378b78c3c 100644
--- a/src/backends/native/meta-kms-impl-device.h
+++ b/src/backends/native/meta-kms-impl-device.h
@@ -22,6 +22,7 @@
 
 #include <glib-object.h>
 #include <stdint.h>
+#include <xf86drm.h>
 #include <xf86drmMode.h>
 
 #include "backends/native/meta-kms-device.h"
@@ -60,6 +61,8 @@ struct _MetaKmsImplDeviceClass
 {
   GObjectClass parent_class;
 
+  void (* setup_drm_event_context) (MetaKmsImplDevice *impl,
+                                    drmEventContext   *drm_event_context);
   MetaKmsFeedback * (* process_update) (MetaKmsImplDevice *impl,
                                         MetaKmsUpdate     *update);
   void (* handle_page_flip_callback) (MetaKmsImplDevice   *impl,
@@ -114,9 +117,19 @@ void meta_kms_impl_device_init_prop_table (MetaKmsImplDevice *impl_device,
                                            int                n_props,
                                            gpointer           user_data);
 
+void meta_kms_impl_device_reload_prop_values (MetaKmsImplDevice *impl_device,
+                                              uint32_t          *drm_props,
+                                              uint64_t          *drm_prop_values,
+                                              int                n_drm_props,
+                                              gpointer           user_data,
+                                              ...);
+
 MetaKmsFeedback * meta_kms_impl_device_process_update (MetaKmsImplDevice *impl_device,
                                                        MetaKmsUpdate     *update);
 
+void meta_kms_impl_device_handle_page_flip_callback (MetaKmsImplDevice   *impl_device,
+                                                     MetaKmsPageFlipData *page_flip_data);
+
 void meta_kms_impl_device_discard_pending_page_flips (MetaKmsImplDevice *impl_device);
 
 int meta_kms_impl_device_close (MetaKmsImplDevice *impl_device);


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