kms/device: Handle tracking capabilities
Devices have capabilities that other parts need to know about. Instead of having them probe using drmMode* API, outsource this to MetaKmsDevice. Currently the only capability tracked is HW cursor size. https://gitlab.gnome.org/GNOME/mutter/merge_requests/930
This commit is contained in:
parent
ae00f5653e
commit
f3cdc9906c
@ -43,6 +43,8 @@ struct _MetaKmsDevice
|
|||||||
GList *crtcs;
|
GList *crtcs;
|
||||||
GList *connectors;
|
GList *connectors;
|
||||||
GList *planes;
|
GList *planes;
|
||||||
|
|
||||||
|
MetaKmsDeviceCaps caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaKmsDevice, meta_kms_device, G_TYPE_OBJECT);
|
G_DEFINE_TYPE (MetaKmsDevice, meta_kms_device, G_TYPE_OBJECT);
|
||||||
@ -71,6 +73,23 @@ meta_kms_device_get_flags (MetaKmsDevice *device)
|
|||||||
return device->flags;
|
return device->flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
gboolean
|
||||||
|
meta_kms_device_get_cursor_size (MetaKmsDevice *device,
|
||||||
|
uint64_t *out_cursor_width,
|
||||||
|
uint64_t *out_cursor_height)
|
||||||
|
{
|
||||||
|
if (device->caps.has_cursor_size)
|
||||||
|
{
|
||||||
|
*out_cursor_width = device->caps.cursor_width;
|
||||||
|
*out_cursor_height = device->caps.cursor_height;
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
meta_kms_device_get_connectors (MetaKmsDevice *device)
|
meta_kms_device_get_connectors (MetaKmsDevice *device)
|
||||||
{
|
{
|
||||||
@ -211,6 +230,7 @@ typedef struct _CreateImplDeviceData
|
|||||||
GList *out_crtcs;
|
GList *out_crtcs;
|
||||||
GList *out_connectors;
|
GList *out_connectors;
|
||||||
GList *out_planes;
|
GList *out_planes;
|
||||||
|
MetaKmsDeviceCaps out_caps;
|
||||||
} CreateImplDeviceData;
|
} CreateImplDeviceData;
|
||||||
|
|
||||||
static gpointer
|
static gpointer
|
||||||
@ -229,6 +249,7 @@ create_impl_device_in_impl (MetaKmsImpl *impl,
|
|||||||
data->out_crtcs = meta_kms_impl_device_copy_crtcs (impl_device);
|
data->out_crtcs = meta_kms_impl_device_copy_crtcs (impl_device);
|
||||||
data->out_connectors = meta_kms_impl_device_copy_connectors (impl_device);
|
data->out_connectors = meta_kms_impl_device_copy_connectors (impl_device);
|
||||||
data->out_planes = meta_kms_impl_device_copy_planes (impl_device);
|
data->out_planes = meta_kms_impl_device_copy_planes (impl_device);
|
||||||
|
data->out_caps = *meta_kms_impl_device_get_caps (impl_device);
|
||||||
|
|
||||||
return GINT_TO_POINTER (TRUE);
|
return GINT_TO_POINTER (TRUE);
|
||||||
}
|
}
|
||||||
@ -271,6 +292,7 @@ meta_kms_device_new (MetaKms *kms,
|
|||||||
device->crtcs = data.out_crtcs;
|
device->crtcs = data.out_crtcs;
|
||||||
device->connectors = data.out_connectors;
|
device->connectors = data.out_connectors;
|
||||||
device->planes = data.out_planes;
|
device->planes = data.out_planes;
|
||||||
|
device->caps = data.out_caps;
|
||||||
|
|
||||||
return device;
|
return device;
|
||||||
}
|
}
|
||||||
|
@ -35,6 +35,10 @@ const char * meta_kms_device_get_path (MetaKmsDevice *device);
|
|||||||
|
|
||||||
MetaKmsDeviceFlag meta_kms_device_get_flags (MetaKmsDevice *device);
|
MetaKmsDeviceFlag meta_kms_device_get_flags (MetaKmsDevice *device);
|
||||||
|
|
||||||
|
gboolean meta_kms_device_get_cursor_size (MetaKmsDevice *device,
|
||||||
|
uint64_t *out_cursor_width,
|
||||||
|
uint64_t *out_cursor_height);
|
||||||
|
|
||||||
GList * meta_kms_device_get_connectors (MetaKmsDevice *device);
|
GList * meta_kms_device_get_connectors (MetaKmsDevice *device);
|
||||||
|
|
||||||
GList * meta_kms_device_get_crtcs (MetaKmsDevice *device);
|
GList * meta_kms_device_get_crtcs (MetaKmsDevice *device);
|
||||||
|
@ -48,6 +48,8 @@ struct _MetaKmsImplDevice
|
|||||||
GList *crtcs;
|
GList *crtcs;
|
||||||
GList *connectors;
|
GList *connectors;
|
||||||
GList *planes;
|
GList *planes;
|
||||||
|
|
||||||
|
MetaKmsDeviceCaps caps;
|
||||||
};
|
};
|
||||||
|
|
||||||
G_DEFINE_TYPE (MetaKmsImplDevice, meta_kms_impl_device, G_TYPE_OBJECT)
|
G_DEFINE_TYPE (MetaKmsImplDevice, meta_kms_impl_device, G_TYPE_OBJECT)
|
||||||
@ -76,6 +78,12 @@ meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device)
|
|||||||
return g_list_copy (impl_device->planes);
|
return g_list_copy (impl_device->planes);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
const MetaKmsDeviceCaps *
|
||||||
|
meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device)
|
||||||
|
{
|
||||||
|
return &impl_device->caps;
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
page_flip_handler (int fd,
|
page_flip_handler (int fd,
|
||||||
unsigned int sequence,
|
unsigned int sequence,
|
||||||
@ -179,6 +187,21 @@ meta_kms_impl_device_find_property (MetaKmsImplDevice *impl_device,
|
|||||||
return NULL;
|
return NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
init_caps (MetaKmsImplDevice *impl_device)
|
||||||
|
{
|
||||||
|
int fd = impl_device->fd;
|
||||||
|
uint64_t cursor_width, cursor_height;
|
||||||
|
|
||||||
|
if (drmGetCap (fd, DRM_CAP_CURSOR_WIDTH, &cursor_width) == 0 &&
|
||||||
|
drmGetCap (fd, DRM_CAP_CURSOR_HEIGHT, &cursor_height) == 0)
|
||||||
|
{
|
||||||
|
impl_device->caps.has_cursor_size = TRUE;
|
||||||
|
impl_device->caps.cursor_width = cursor_width;
|
||||||
|
impl_device->caps.cursor_height = cursor_height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
init_crtcs (MetaKmsImplDevice *impl_device,
|
init_crtcs (MetaKmsImplDevice *impl_device,
|
||||||
drmModeRes *drm_resources)
|
drmModeRes *drm_resources)
|
||||||
@ -385,6 +408,8 @@ meta_kms_impl_device_new (MetaKmsDevice *device,
|
|||||||
impl_device->impl = impl;
|
impl_device->impl = impl;
|
||||||
impl_device->fd = fd;
|
impl_device->fd = fd;
|
||||||
|
|
||||||
|
init_caps (impl_device);
|
||||||
|
|
||||||
init_crtcs (impl_device, drm_resources);
|
init_crtcs (impl_device, drm_resources);
|
||||||
init_planes (impl_device);
|
init_planes (impl_device);
|
||||||
|
|
||||||
|
@ -28,6 +28,13 @@
|
|||||||
#include "backends/native/meta-kms-types.h"
|
#include "backends/native/meta-kms-types.h"
|
||||||
#include "backends/native/meta-kms-update.h"
|
#include "backends/native/meta-kms-update.h"
|
||||||
|
|
||||||
|
typedef struct _MetaKmsDeviceCaps
|
||||||
|
{
|
||||||
|
gboolean has_cursor_size;
|
||||||
|
uint64_t cursor_width;
|
||||||
|
uint64_t cursor_height;
|
||||||
|
} MetaKmsDeviceCaps;
|
||||||
|
|
||||||
#define META_TYPE_KMS_IMPL_DEVICE (meta_kms_impl_device_get_type ())
|
#define META_TYPE_KMS_IMPL_DEVICE (meta_kms_impl_device_get_type ())
|
||||||
G_DECLARE_FINAL_TYPE (MetaKmsImplDevice, meta_kms_impl_device,
|
G_DECLARE_FINAL_TYPE (MetaKmsImplDevice, meta_kms_impl_device,
|
||||||
META, KMS_IMPL_DEVICE,
|
META, KMS_IMPL_DEVICE,
|
||||||
@ -41,6 +48,8 @@ GList * meta_kms_impl_device_copy_crtcs (MetaKmsImplDevice *impl_device);
|
|||||||
|
|
||||||
GList * meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device);
|
GList * meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device);
|
||||||
|
|
||||||
|
const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device);
|
||||||
|
|
||||||
gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice *impl_device,
|
gboolean meta_kms_impl_device_dispatch (MetaKmsImplDevice *impl_device,
|
||||||
GError **error);
|
GError **error);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user