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>
This commit is contained in:
Jonas Ådahl 2020-10-02 16:56:10 +02:00 committed by Marge Bot
parent b693e58c53
commit c0e9a6fe15
3 changed files with 43 additions and 24 deletions

View File

@ -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 =

View File

@ -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)
{

View File

@ -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);