kms: Add MetaKmsMode abstraction

This contains a copy of a drmModeModeInfo, describing a mode. It also
has an unused pointer to the impl device it is associated with. It'll
later be used to get a blob ID for the mode.

Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1488>
This commit is contained in:
Jonas Ådahl 2020-06-04 17:12:34 +02:00 committed by Marge Bot
parent 22b926eea7
commit f0d3201dab
10 changed files with 157 additions and 13 deletions

View File

@ -41,6 +41,7 @@
#include "backends/native/meta-crtc-mode-kms.h" #include "backends/native/meta-crtc-mode-kms.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-device.h"
#include "backends/native/meta-kms-mode.h"
#include "backends/native/meta-kms-update.h" #include "backends/native/meta-kms-update.h"
#include "backends/native/meta-kms-utils.h" #include "backends/native/meta-kms-utils.h"
#include "backends/native/meta-kms.h" #include "backends/native/meta-kms.h"
@ -410,13 +411,20 @@ init_modes (MetaGpuKms *gpu_kms)
{ {
MetaKmsConnector *kms_connector = l->data; MetaKmsConnector *kms_connector = l->data;
const MetaKmsConnectorState *state; const MetaKmsConnectorState *state;
GList *l_mode;
state = meta_kms_connector_get_current_state (kms_connector); state = meta_kms_connector_get_current_state (kms_connector);
if (!state) if (!state)
continue; continue;
for (i = 0; i < state->n_modes; i++) for (l_mode = state->modes; l_mode; l_mode = l_mode->next)
g_hash_table_add (modes_table, &state->modes[i]); {
MetaKmsMode *kms_mode = l_mode->data;
const drmModeModeInfo *drm_mode =
meta_kms_mode_get_drm_mode (kms_mode);
g_hash_table_add (modes_table, (drmModeModeInfo *) drm_mode);
}
} }
modes = NULL; modes = NULL;

View File

@ -27,6 +27,7 @@
#include "backends/native/meta-kms-crtc.h" #include "backends/native/meta-kms-crtc.h"
#include "backends/native/meta-kms-device-private.h" #include "backends/native/meta-kms-device-private.h"
#include "backends/native/meta-kms-impl-device.h" #include "backends/native/meta-kms-impl-device.h"
#include "backends/native/meta-kms-mode-private.h"
#include "backends/native/meta-kms-update-private.h" #include "backends/native/meta-kms-update-private.h"
struct _MetaKmsConnector struct _MetaKmsConnector
@ -354,12 +355,19 @@ state_set_physical_dimensions (MetaKmsConnectorState *state,
static void static void
state_set_modes (MetaKmsConnectorState *state, state_set_modes (MetaKmsConnectorState *state,
MetaKmsImplDevice *impl_device,
drmModeConnector *drm_connector) drmModeConnector *drm_connector)
{ {
state->modes = int i;
g_memdup (drm_connector->modes,
drm_connector->count_modes * sizeof (drmModeModeInfo)); for (i = 0; i < drm_connector->count_modes; i++)
state->n_modes = drm_connector->count_modes; {
MetaKmsMode *mode;
mode = meta_kms_mode_new (impl_device, &drm_connector->modes[i]);
state->modes = g_list_prepend (state->modes, mode);
}
state->modes = g_list_reverse (state->modes);
} }
static void static void
@ -452,7 +460,7 @@ static void
meta_kms_connector_state_free (MetaKmsConnectorState *state) meta_kms_connector_state_free (MetaKmsConnectorState *state)
{ {
g_clear_pointer (&state->edid_data, g_bytes_unref); g_clear_pointer (&state->edid_data, g_bytes_unref);
g_free (state->modes); g_list_free_full (state->modes, (GDestroyNotify) meta_kms_mode_free);
g_free (state); g_free (state);
} }
@ -480,7 +488,7 @@ meta_kms_connector_read_state (MetaKmsConnector *connector,
state_set_physical_dimensions (state, drm_connector); state_set_physical_dimensions (state, drm_connector);
state_set_modes (state, drm_connector); state_set_modes (state, impl_device, drm_connector);
state_set_crtc_state (state, drm_connector, impl_device, drm_resources); state_set_crtc_state (state, drm_connector, impl_device, drm_resources);

View File

@ -39,8 +39,7 @@ typedef struct _MetaKmsConnectorState
uint32_t common_possible_clones; uint32_t common_possible_clones;
uint32_t encoder_device_idxs; uint32_t encoder_device_idxs;
drmModeModeInfo *modes; GList *modes;
int n_modes;
uint32_t width_mm; uint32_t width_mm;
uint32_t height_mm; uint32_t height_mm;

View File

@ -0,0 +1,30 @@
/*
* Copyright (C) 2020 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_KMS_MODE_PRIVATE_H
#define META_KMS_MODE_PRIVATE_H
#include "backends/native/meta-kms-mode.h"
void meta_kms_mode_free (MetaKmsMode *mode);
MetaKmsMode * meta_kms_mode_new (MetaKmsImplDevice *impl_device,
const drmModeModeInfo *drm_mode);
#endif /* META_KMS_MODE_PRIVATE_H */

View File

@ -0,0 +1,55 @@
/*
* Copyright (C) 2020 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#include "config.h"
#include "backends/native/meta-kms-mode-private.h"
#include "backends/native/meta-kms-impl-device.h"
struct _MetaKmsMode
{
MetaKmsImplDevice *impl_device;
drmModeModeInfo drm_mode;
};
const drmModeModeInfo *
meta_kms_mode_get_drm_mode (MetaKmsMode *mode)
{
return &mode->drm_mode;
}
void
meta_kms_mode_free (MetaKmsMode *mode)
{
g_free (mode);
}
MetaKmsMode *
meta_kms_mode_new (MetaKmsImplDevice *impl_device,
const drmModeModeInfo *drm_mode)
{
MetaKmsMode *mode;
mode = g_new0 (MetaKmsMode, 1);
mode->impl_device = impl_device;
mode->drm_mode = *drm_mode;
return mode;
}

View File

@ -0,0 +1,31 @@
/*
* Copyright (C) 2020 Red Hat
*
* This program is free software; you can redistribute it and/or
* modify it under the terms of the GNU General Public License as
* published by the Free Software Foundation; either version 2 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful, but
* WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
* General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with this program; if not, write to the Free Software
* Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA
* 02111-1307, USA.
*/
#ifndef META_KMS_MODE_H
#define META_KMS_MODE_H
#include <glib.h>
#include <xf86drm.h>
#include <xf86drmMode.h>
#include "backends/native/meta-kms-types.h"
const drmModeModeInfo * meta_kms_mode_get_drm_mode (MetaKmsMode *mode);
#endif /* META_KMS_MODE_H */

View File

@ -33,6 +33,8 @@ typedef struct _MetaKmsUpdate MetaKmsUpdate;
typedef struct _MetaKmsPlaneAssignment MetaKmsPlaneAssignment; typedef struct _MetaKmsPlaneAssignment MetaKmsPlaneAssignment;
typedef struct _MetaKmsModeSet MetaKmsModeSet; typedef struct _MetaKmsModeSet MetaKmsModeSet;
typedef struct _MetaKmsMode MetaKmsMode;
typedef struct _MetaKmsFeedback MetaKmsFeedback; typedef struct _MetaKmsFeedback MetaKmsFeedback;
typedef struct _MetaKmsPageFlipFeedback MetaKmsPageFlipFeedback; typedef struct _MetaKmsPageFlipFeedback MetaKmsPageFlipFeedback;

View File

@ -83,6 +83,12 @@
* should be presented on a CRTC. Planes can either be primary planes, used as * should be presented on a CRTC. Planes can either be primary planes, used as
* a backdrop for CRTCs, overlay planes, and cursor planes. * a backdrop for CRTCs, overlay planes, and cursor planes.
* *
* #MetaKmsMode:
*
* Represents a mode a CRTC and connector can be configured with.
* Represents both modes directly derived from the devices, as well as
* fall back modes when the CRTC supports scaling.
*
* #MetaKmsUpdate: * #MetaKmsUpdate:
* *
* A KMS transaction object, meant to be processed potentially atomically when * A KMS transaction object, meant to be processed potentially atomically when

View File

@ -30,6 +30,7 @@
#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-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"
@ -240,17 +241,19 @@ init_output_modes (MetaOutputInfo *output_info,
GError **error) GError **error)
{ {
const MetaKmsConnectorState *connector_state; const MetaKmsConnectorState *connector_state;
GList *l;
int i; int i;
connector_state = meta_kms_connector_get_current_state (kms_connector); connector_state = meta_kms_connector_get_current_state (kms_connector);
output_info->preferred_mode = NULL; output_info->preferred_mode = NULL;
output_info->n_modes = connector_state->n_modes; output_info->n_modes = g_list_length (connector_state->modes);
output_info->modes = g_new0 (MetaCrtcMode *, output_info->n_modes); output_info->modes = g_new0 (MetaCrtcMode *, output_info->n_modes);
for (i = 0; i < connector_state->n_modes; i++) for (l = connector_state->modes, i = 0; l; l = l->next, i++)
{ {
drmModeModeInfo *drm_mode = &connector_state->modes[i]; MetaKmsMode *kms_mode = l->data;
const drmModeModeInfo *drm_mode = meta_kms_mode_get_drm_mode (kms_mode);
MetaCrtcMode *crtc_mode; MetaCrtcMode *crtc_mode;
crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms, drm_mode); crtc_mode = meta_gpu_kms_get_mode_from_drm_mode (gpu_kms, drm_mode);

View File

@ -684,6 +684,8 @@ if have_native_backend
'backends/native/meta-kms-impl-simple.h', 'backends/native/meta-kms-impl-simple.h',
'backends/native/meta-kms-impl.c', 'backends/native/meta-kms-impl.c',
'backends/native/meta-kms-impl.h', 'backends/native/meta-kms-impl.h',
'backends/native/meta-kms-mode.c',
'backends/native/meta-kms-mode.h',
'backends/native/meta-kms-page-flip.c', 'backends/native/meta-kms-page-flip.c',
'backends/native/meta-kms-page-flip-private.h', 'backends/native/meta-kms-page-flip-private.h',
'backends/native/meta-kms-plane.c', 'backends/native/meta-kms-plane.c',