output-kms: Hand over fallback mode management to MetaKms

Eventually we need MetaKmsMode for more than carrying the
drmModeModeInfo, so prepare for that by having the KMS layer create
MetaKmsMode for those as well.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>
This commit is contained in:
Jonas Ådahl 2020-07-02 11:54:56 +02:00 committed by Marge Bot
parent 0fa0eeef57
commit d3abaf46a1
7 changed files with 98 additions and 55 deletions

View File

@ -48,8 +48,6 @@
#include "backends/native/meta-launcher.h" #include "backends/native/meta-launcher.h"
#include "backends/native/meta-output-kms.h" #include "backends/native/meta-output-kms.h"
#include "meta-default-modes.h"
struct _MetaGpuKms struct _MetaGpuKms
{ {
MetaGpu parent; MetaGpu parent;
@ -395,12 +393,12 @@ static void
init_modes (MetaGpuKms *gpu_kms) init_modes (MetaGpuKms *gpu_kms)
{ {
MetaGpu *gpu = META_GPU (gpu_kms); MetaGpu *gpu = META_GPU (gpu_kms);
MetaKmsDevice *kms_device = gpu_kms->kms_device;
GHashTable *modes_table; GHashTable *modes_table;
GList *l; GList *l;
GList *modes; GList *modes;
GHashTableIter iter; GHashTableIter iter;
drmModeModeInfo *drm_mode; drmModeModeInfo *drm_mode;
int i;
long mode_id; long mode_id;
/* /*
@ -427,6 +425,15 @@ init_modes (MetaGpuKms *gpu_kms)
} }
} }
for (l = meta_kms_device_get_fallback_modes (kms_device); l; l = l->next)
{
MetaKmsMode *fallback_mode = l->data;
const drmModeModeInfo *drm_mode;
drm_mode = meta_kms_mode_get_drm_mode (fallback_mode);
g_hash_table_add (modes_table, (drmModeModeInfo *) drm_mode);
}
modes = NULL; modes = NULL;
g_hash_table_iter_init (&iter, modes_table); g_hash_table_iter_init (&iter, modes_table);
@ -443,28 +450,6 @@ init_modes (MetaGpuKms *gpu_kms)
g_hash_table_destroy (modes_table); g_hash_table_destroy (modes_table);
for (i = 0; i < G_N_ELEMENTS (meta_default_landscape_drm_mode_infos); i++)
{
MetaCrtcModeKms *mode;
mode = meta_crtc_mode_kms_new (&meta_default_landscape_drm_mode_infos[i],
mode_id);
modes = g_list_append (modes, mode);
mode_id++;
}
for (i = 0; i < G_N_ELEMENTS (meta_default_portrait_drm_mode_infos); i++)
{
MetaCrtcModeKms *mode;
mode = meta_crtc_mode_kms_new (&meta_default_portrait_drm_mode_infos[i],
mode_id);
modes = g_list_append (modes, mode);
mode_id++;
}
meta_gpu_take_modes (gpu, modes); meta_gpu_take_modes (gpu, modes);
} }

View File

@ -47,6 +47,8 @@ struct _MetaKmsDevice
GList *planes; GList *planes;
MetaKmsDeviceCaps caps; MetaKmsDeviceCaps caps;
GList *fallback_modes;
}; };
G_DEFINE_TYPE (MetaKmsDevice, meta_kms_device, G_TYPE_OBJECT); G_DEFINE_TYPE (MetaKmsDevice, meta_kms_device, G_TYPE_OBJECT);
@ -157,6 +159,12 @@ meta_kms_device_get_cursor_plane_for (MetaKmsDevice *device,
return get_plane_with_type_for (device, crtc, META_KMS_PLANE_TYPE_CURSOR); return get_plane_with_type_for (device, crtc, META_KMS_PLANE_TYPE_CURSOR);
} }
GList *
meta_kms_device_get_fallback_modes (MetaKmsDevice *device)
{
return device->fallback_modes;
}
void void
meta_kms_device_update_states_in_impl (MetaKmsDevice *device) meta_kms_device_update_states_in_impl (MetaKmsDevice *device)
{ {
@ -214,6 +222,7 @@ typedef struct _CreateImplDeviceData
GList *out_connectors; GList *out_connectors;
GList *out_planes; GList *out_planes;
MetaKmsDeviceCaps out_caps; MetaKmsDeviceCaps out_caps;
GList *out_fallback_modes;
char *out_driver_name; char *out_driver_name;
char *out_driver_description; char *out_driver_description;
} CreateImplDeviceData; } CreateImplDeviceData;
@ -235,6 +244,8 @@ create_impl_device_in_impl (MetaKmsImpl *impl,
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); data->out_caps = *meta_kms_impl_device_get_caps (impl_device);
data->out_fallback_modes =
meta_kms_impl_device_copy_fallback_modes (impl_device);
data->out_driver_name = data->out_driver_name =
g_strdup (meta_kms_impl_device_get_driver_name (impl_device)); g_strdup (meta_kms_impl_device_get_driver_name (impl_device));
data->out_driver_description = data->out_driver_description =
@ -282,6 +293,7 @@ meta_kms_device_new (MetaKms *kms,
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; device->caps = data.out_caps;
device->fallback_modes = data.out_fallback_modes;
device->driver_name = data.out_driver_name; device->driver_name = data.out_driver_name;
device->driver_description = data.out_driver_description; device->driver_description = data.out_driver_description;

View File

@ -53,6 +53,8 @@ MetaKmsPlane * meta_kms_device_get_primary_plane_for (MetaKmsDevice *device,
MetaKmsPlane * meta_kms_device_get_cursor_plane_for (MetaKmsDevice *device, MetaKmsPlane * meta_kms_device_get_cursor_plane_for (MetaKmsDevice *device,
MetaKmsCrtc *crtc); MetaKmsCrtc *crtc);
GList * meta_kms_device_get_fallback_modes (MetaKmsDevice *device);
MetaKmsDevice * meta_kms_device_new (MetaKms *kms, MetaKmsDevice * meta_kms_device_new (MetaKms *kms,
const char *path, const char *path,
MetaKmsDeviceFlag flags, MetaKmsDeviceFlag flags,

View File

@ -29,12 +29,15 @@
#include "backends/native/meta-kms-crtc-private.h" #include "backends/native/meta-kms-crtc-private.h"
#include "backends/native/meta-kms-crtc.h" #include "backends/native/meta-kms-crtc.h"
#include "backends/native/meta-kms-impl.h" #include "backends/native/meta-kms-impl.h"
#include "backends/native/meta-kms-mode-private.h"
#include "backends/native/meta-kms-page-flip-private.h" #include "backends/native/meta-kms-page-flip-private.h"
#include "backends/native/meta-kms-plane-private.h" #include "backends/native/meta-kms-plane-private.h"
#include "backends/native/meta-kms-plane.h" #include "backends/native/meta-kms-plane.h"
#include "backends/native/meta-kms-private.h" #include "backends/native/meta-kms-private.h"
#include "backends/native/meta-kms-update.h" #include "backends/native/meta-kms-update.h"
#include "meta-default-modes.h"
struct _MetaKmsImplDevice struct _MetaKmsImplDevice
{ {
GObject parent; GObject parent;
@ -53,6 +56,8 @@ struct _MetaKmsImplDevice
GList *planes; GList *planes;
MetaKmsDeviceCaps caps; MetaKmsDeviceCaps caps;
GList *fallback_modes;
}; };
G_DEFINE_TYPE (MetaKmsImplDevice, meta_kms_impl_device, G_TYPE_OBJECT) G_DEFINE_TYPE (MetaKmsImplDevice, meta_kms_impl_device, G_TYPE_OBJECT)
@ -87,6 +92,12 @@ meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device)
return &impl_device->caps; return &impl_device->caps;
} }
GList *
meta_kms_impl_device_copy_fallback_modes (MetaKmsImplDevice *impl_device)
{
return g_list_copy (impl_device->fallback_modes);
}
const char * const char *
meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device) meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device)
{ {
@ -372,6 +383,35 @@ init_planes (MetaKmsImplDevice *impl_device)
impl_device->planes = g_list_reverse (impl_device->planes); impl_device->planes = g_list_reverse (impl_device->planes);
} }
static void
init_fallback_modes (MetaKmsImplDevice *impl_device)
{
GList *modes = NULL;
int i;
for (i = 0; i < G_N_ELEMENTS (meta_default_landscape_drm_mode_infos); i++)
{
MetaKmsMode *mode;
mode = meta_kms_mode_new (impl_device,
&meta_default_landscape_drm_mode_infos[i],
META_KMS_MODE_FLAG_FALLBACK_LANDSCAPE);
modes = g_list_prepend (modes, mode);
}
for (i = 0; i < G_N_ELEMENTS (meta_default_portrait_drm_mode_infos); i++)
{
MetaKmsMode *mode;
mode = meta_kms_mode_new (impl_device,
&meta_default_portrait_drm_mode_infos[i],
META_KMS_MODE_FLAG_FALLBACK_PORTRAIT);
modes = g_list_prepend (modes, mode);
}
impl_device->fallback_modes = g_list_reverse (modes);
}
static void static void
init_info (MetaKmsImplDevice *impl_device) init_info (MetaKmsImplDevice *impl_device)
{ {
@ -468,6 +508,8 @@ meta_kms_impl_device_new (MetaKmsDevice *device,
init_planes (impl_device); init_planes (impl_device);
init_info (impl_device); init_info (impl_device);
init_fallback_modes (impl_device);
update_connectors (impl_device, drm_resources); update_connectors (impl_device, drm_resources);
drmModeFreeResources (drm_resources); drmModeFreeResources (drm_resources);
@ -516,6 +558,8 @@ meta_kms_impl_device_finalize (GObject *object)
g_list_free_full (impl_device->planes, g_object_unref); g_list_free_full (impl_device->planes, g_object_unref);
g_list_free_full (impl_device->crtcs, g_object_unref); g_list_free_full (impl_device->crtcs, g_object_unref);
g_list_free_full (impl_device->connectors, g_object_unref); g_list_free_full (impl_device->connectors, g_object_unref);
g_list_free_full (impl_device->fallback_modes,
(GDestroyNotify) meta_kms_mode_free);
g_free (impl_device->driver_name); g_free (impl_device->driver_name);
g_free (impl_device->driver_description); g_free (impl_device->driver_description);

View File

@ -50,6 +50,8 @@ GList * meta_kms_impl_device_copy_planes (MetaKmsImplDevice *impl_device);
const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device); const MetaKmsDeviceCaps * meta_kms_impl_device_get_caps (MetaKmsImplDevice *impl_device);
GList * meta_kms_impl_device_copy_fallback_modes (MetaKmsImplDevice *impl_device);
const char * meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device); const char * meta_kms_impl_device_get_driver_name (MetaKmsImplDevice *impl_device);
const char * meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device); const char * meta_kms_impl_device_get_driver_description (MetaKmsImplDevice *impl_device);

View File

@ -29,6 +29,8 @@
typedef enum _MetaKmsModeFlag typedef enum _MetaKmsModeFlag
{ {
META_KMS_MODE_FLAG_NONE = 0, META_KMS_MODE_FLAG_NONE = 0,
META_KMS_MODE_FLAG_FALLBACK_LANDSCAPE = 1 << 0,
META_KMS_MODE_FLAG_FALLBACK_PORTRAIT = 1 << 1,
} MetaKmsModeFlag; } MetaKmsModeFlag;
const char * meta_kms_mode_get_name (MetaKmsMode *mode); const char * meta_kms_mode_get_name (MetaKmsMode *mode);

View File

@ -30,13 +30,12 @@
#include "backends/meta-crtc.h" #include "backends/meta-crtc.h"
#include "backends/native/meta-kms-connector.h" #include "backends/native/meta-kms-connector.h"
#include "backends/native/meta-kms-device.h"
#include "backends/native/meta-kms-mode.h" #include "backends/native/meta-kms-mode.h"
#include "backends/native/meta-kms-utils.h" #include "backends/native/meta-kms-utils.h"
#include "backends/native/meta-crtc-kms.h" #include "backends/native/meta-crtc-kms.h"
#include "backends/native/meta-crtc-mode-kms.h" #include "backends/native/meta-crtc-mode-kms.h"
#include "meta-default-modes.h"
#define SYNC_TOLERANCE 0.01 /* 1 percent */ #define SYNC_TOLERANCE 0.01 /* 1 percent */
typedef struct _MetaOutputKms typedef struct _MetaOutputKms
@ -152,6 +151,9 @@ add_common_modes (MetaOutputInfo *output_info,
unsigned max_hdisplay = 0; unsigned max_hdisplay = 0;
unsigned max_vdisplay = 0; unsigned max_vdisplay = 0;
float max_refresh_rate = 0.0; float max_refresh_rate = 0.0;
MetaKmsDevice *kms_device;
MetaKmsModeFlag flag_filter;
GList *l;
for (i = 0; i < output_info->n_modes; i++) for (i = 0; i < output_info->n_modes; i++)
{ {
@ -168,38 +170,32 @@ add_common_modes (MetaOutputInfo *output_info,
max_refresh_rate = MAX (max_refresh_rate, 60.0); max_refresh_rate = MAX (max_refresh_rate, 60.0);
max_refresh_rate *= (1 + SYNC_TOLERANCE); max_refresh_rate *= (1 + SYNC_TOLERANCE);
kms_device = meta_gpu_kms_get_kms_device (gpu_kms);
array = g_ptr_array_new (); array = g_ptr_array_new ();
if (max_hdisplay > max_vdisplay) if (max_hdisplay > max_vdisplay)
{ flag_filter = META_KMS_MODE_FLAG_FALLBACK_LANDSCAPE;
for (i = 0; i < G_N_ELEMENTS (meta_default_landscape_drm_mode_infos); i++)
{
drm_mode = &meta_default_landscape_drm_mode_infos[i];
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
if (drm_mode->hdisplay > max_hdisplay ||
drm_mode->vdisplay > max_vdisplay ||
refresh_rate > max_refresh_rate)
continue;
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms,
drm_mode);
g_ptr_array_add (array, crtc_mode);
}
}
else else
{ flag_filter = META_KMS_MODE_FLAG_FALLBACK_PORTRAIT;
for (i = 0; i < G_N_ELEMENTS (meta_default_portrait_drm_mode_infos); i++)
{
drm_mode = &meta_default_portrait_drm_mode_infos[i];
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
if (drm_mode->hdisplay > max_hdisplay ||
drm_mode->vdisplay > max_vdisplay ||
refresh_rate > max_refresh_rate)
continue;
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms, for (l = meta_kms_device_get_fallback_modes (kms_device); l; l = l->next)
drm_mode); {
g_ptr_array_add (array, crtc_mode); MetaKmsMode *fallback_mode = l->data;
} const drmModeModeInfo *drm_mode;
if (!(meta_kms_mode_get_flags (fallback_mode) & flag_filter))
continue;
drm_mode = meta_kms_mode_get_drm_mode (fallback_mode);
refresh_rate = meta_calculate_drm_mode_refresh_rate (drm_mode);
if (drm_mode->hdisplay > max_hdisplay ||
drm_mode->vdisplay > max_vdisplay ||
refresh_rate > max_refresh_rate)
continue;
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms, drm_mode);
g_ptr_array_add (array, crtc_mode);
} }
output_info->modes = g_renew (MetaCrtcMode *, output_info->modes, output_info->modes = g_renew (MetaCrtcMode *, output_info->modes,