kms: Allow setting the "VRR_ENABLED" property on a CRTC
Add functions to update and monitor the value of the "VRR_ENABLED" KMS property. This requires the addition of functions to process CRTC property updates in both the atomic and the simple KMS backends. The implementation is similar to the implemention of processing connector updates. Part-of: <https://gitlab.gnome.org/GNOME/mutter/-/merge_requests/1154>
This commit is contained in:
parent
b7128b1d12
commit
4ad282cf26
@ -28,6 +28,7 @@ typedef enum _MetaKmsCrtcProp
|
|||||||
META_KMS_CRTC_PROP_ACTIVE,
|
META_KMS_CRTC_PROP_ACTIVE,
|
||||||
META_KMS_CRTC_PROP_GAMMA_LUT,
|
META_KMS_CRTC_PROP_GAMMA_LUT,
|
||||||
META_KMS_CRTC_PROP_GAMMA_LUT_SIZE,
|
META_KMS_CRTC_PROP_GAMMA_LUT_SIZE,
|
||||||
|
META_KMS_CRTC_PROP_VRR_ENABLED,
|
||||||
META_KMS_CRTC_N_PROPS
|
META_KMS_CRTC_N_PROPS
|
||||||
} MetaKmsCrtcProp;
|
} MetaKmsCrtcProp;
|
||||||
|
|
||||||
|
@ -227,6 +227,9 @@ meta_kms_crtc_state_changes (MetaKmsCrtcState *state,
|
|||||||
if (!meta_drm_mode_equal (&state->drm_mode, &other_state->drm_mode))
|
if (!meta_drm_mode_equal (&state->drm_mode, &other_state->drm_mode))
|
||||||
return META_KMS_RESOURCE_CHANGE_FULL;
|
return META_KMS_RESOURCE_CHANGE_FULL;
|
||||||
|
|
||||||
|
if (state->vrr_enabled != other_state->vrr_enabled)
|
||||||
|
return META_KMS_RESOURCE_CHANGE_FULL;
|
||||||
|
|
||||||
if (!gamma_equal (state, other_state))
|
if (!gamma_equal (state, other_state))
|
||||||
return META_KMS_RESOURCE_CHANGE_GAMMA;
|
return META_KMS_RESOURCE_CHANGE_GAMMA;
|
||||||
|
|
||||||
@ -241,7 +244,7 @@ meta_kms_crtc_read_state (MetaKmsCrtc *crtc,
|
|||||||
{
|
{
|
||||||
MetaKmsCrtcState crtc_state = {0};
|
MetaKmsCrtcState crtc_state = {0};
|
||||||
MetaKmsResourceChanges changes = META_KMS_RESOURCE_CHANGE_NONE;
|
MetaKmsResourceChanges changes = META_KMS_RESOURCE_CHANGE_NONE;
|
||||||
MetaKmsProp *active_prop;
|
MetaKmsProp *prop;
|
||||||
|
|
||||||
meta_kms_impl_device_update_prop_table (impl_device,
|
meta_kms_impl_device_update_prop_table (impl_device,
|
||||||
drm_props->props,
|
drm_props->props,
|
||||||
@ -260,13 +263,17 @@ meta_kms_crtc_read_state (MetaKmsCrtc *crtc,
|
|||||||
crtc_state.is_drm_mode_valid = drm_crtc->mode_valid;
|
crtc_state.is_drm_mode_valid = drm_crtc->mode_valid;
|
||||||
crtc_state.drm_mode = drm_crtc->mode;
|
crtc_state.drm_mode = drm_crtc->mode;
|
||||||
|
|
||||||
active_prop = &crtc->prop_table.props[META_KMS_CRTC_PROP_ACTIVE];
|
prop = &crtc->prop_table.props[META_KMS_CRTC_PROP_ACTIVE];
|
||||||
|
|
||||||
if (active_prop->prop_id)
|
if (prop->prop_id)
|
||||||
crtc_state.is_active = !!active_prop->value;
|
crtc_state.is_active = !!prop->value;
|
||||||
else
|
else
|
||||||
crtc_state.is_active = drm_crtc->mode_valid;
|
crtc_state.is_active = drm_crtc->mode_valid;
|
||||||
|
|
||||||
|
prop = &crtc->prop_table.props[META_KMS_CRTC_PROP_VRR_ENABLED];
|
||||||
|
if (prop->prop_id)
|
||||||
|
crtc_state.vrr_enabled = !!prop->value;
|
||||||
|
|
||||||
read_gamma_state (crtc, &crtc_state, impl_device, drm_crtc);
|
read_gamma_state (crtc, &crtc_state, impl_device, drm_crtc);
|
||||||
|
|
||||||
if (!crtc_state.is_active)
|
if (!crtc_state.is_active)
|
||||||
@ -343,6 +350,7 @@ meta_kms_crtc_predict_state_in_impl (MetaKmsCrtc *crtc,
|
|||||||
MetaKmsUpdate *update)
|
MetaKmsUpdate *update)
|
||||||
{
|
{
|
||||||
GList *mode_sets;
|
GList *mode_sets;
|
||||||
|
GList *crtc_updates;
|
||||||
GList *crtc_color_updates;
|
GList *crtc_color_updates;
|
||||||
GList *l;
|
GList *l;
|
||||||
|
|
||||||
@ -380,6 +388,20 @@ meta_kms_crtc_predict_state_in_impl (MetaKmsCrtc *crtc,
|
|||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
crtc_updates = meta_kms_update_get_crtc_updates (update);
|
||||||
|
for (l = crtc_updates; l; l = l->next)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update = l->data;
|
||||||
|
|
||||||
|
if (crtc_update->crtc != crtc)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (crtc_update->vrr.has_update)
|
||||||
|
crtc->current_state.vrr_enabled = !!crtc_update->vrr.is_enabled;
|
||||||
|
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
crtc_color_updates = meta_kms_update_get_crtc_color_updates (update);
|
crtc_color_updates = meta_kms_update_get_crtc_color_updates (update);
|
||||||
for (l = crtc_color_updates; l; l = l->next)
|
for (l = crtc_color_updates; l; l = l->next)
|
||||||
{
|
{
|
||||||
@ -430,6 +452,11 @@ init_properties (MetaKmsCrtc *crtc,
|
|||||||
.name = "GAMMA_LUT_SIZE",
|
.name = "GAMMA_LUT_SIZE",
|
||||||
.type = DRM_MODE_PROP_RANGE,
|
.type = DRM_MODE_PROP_RANGE,
|
||||||
},
|
},
|
||||||
|
[META_KMS_CRTC_PROP_VRR_ENABLED] =
|
||||||
|
{
|
||||||
|
.name = "VRR_ENABLED",
|
||||||
|
.type = DRM_MODE_PROP_RANGE,
|
||||||
|
},
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -34,6 +34,8 @@ typedef struct _MetaKmsCrtcState
|
|||||||
gboolean is_drm_mode_valid;
|
gboolean is_drm_mode_valid;
|
||||||
drmModeModeInfo drm_mode;
|
drmModeModeInfo drm_mode;
|
||||||
|
|
||||||
|
gboolean vrr_enabled;
|
||||||
|
|
||||||
struct {
|
struct {
|
||||||
MetaGammaLut *value;
|
MetaGammaLut *value;
|
||||||
int size;
|
int size;
|
||||||
|
@ -362,6 +362,31 @@ add_crtc_property (MetaKmsImplDevice *impl_device,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
process_crtc_update (MetaKmsImplDevice *impl_device,
|
||||||
|
MetaKmsUpdate *update,
|
||||||
|
drmModeAtomicReq *req,
|
||||||
|
GArray *blob_ids,
|
||||||
|
gpointer update_entry,
|
||||||
|
gpointer user_data,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update = update_entry;
|
||||||
|
MetaKmsCrtc *crtc = crtc_update->crtc;
|
||||||
|
|
||||||
|
if (crtc_update->vrr.has_update)
|
||||||
|
{
|
||||||
|
if (!add_crtc_property (impl_device,
|
||||||
|
crtc, req,
|
||||||
|
META_KMS_CRTC_PROP_VRR_ENABLED,
|
||||||
|
!!crtc_update->vrr.is_enabled,
|
||||||
|
error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
process_mode_set (MetaKmsImplDevice *impl_device,
|
process_mode_set (MetaKmsImplDevice *impl_device,
|
||||||
MetaKmsUpdate *update,
|
MetaKmsUpdate *update,
|
||||||
@ -1086,6 +1111,16 @@ meta_kms_impl_device_atomic_process_update (MetaKmsImplDevice *impl_device,
|
|||||||
&error))
|
&error))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (!process_entries (impl_device,
|
||||||
|
update,
|
||||||
|
req,
|
||||||
|
blob_ids,
|
||||||
|
meta_kms_update_get_crtc_updates (update),
|
||||||
|
NULL,
|
||||||
|
process_crtc_update,
|
||||||
|
&error))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (!process_entries (impl_device,
|
if (!process_entries (impl_device,
|
||||||
update,
|
update,
|
||||||
req,
|
req,
|
||||||
|
@ -179,6 +179,47 @@ set_connector_property (MetaKmsImplDevice *impl_device,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
set_crtc_property (MetaKmsImplDevice *impl_device,
|
||||||
|
MetaKmsCrtc *crtc,
|
||||||
|
MetaKmsCrtcProp prop,
|
||||||
|
uint64_t value,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
uint32_t prop_id;
|
||||||
|
int fd;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
prop_id = meta_kms_crtc_get_prop_id (crtc, prop);
|
||||||
|
if (!prop_id)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, G_IO_ERROR_NOT_SUPPORTED,
|
||||||
|
"Property (%s) not found on CRTC %u",
|
||||||
|
meta_kms_crtc_get_prop_name (crtc, prop),
|
||||||
|
meta_kms_crtc_get_id (crtc));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
fd = meta_kms_impl_device_get_fd (impl_device);
|
||||||
|
|
||||||
|
ret = drmModeObjectSetProperty (fd,
|
||||||
|
meta_kms_crtc_get_id (crtc),
|
||||||
|
DRM_MODE_OBJECT_CRTC,
|
||||||
|
prop_id,
|
||||||
|
value);
|
||||||
|
if (ret != 0)
|
||||||
|
{
|
||||||
|
g_set_error (error, G_IO_ERROR, g_io_error_from_errno (-ret),
|
||||||
|
"Failed to set CRTC %u property %u: %s",
|
||||||
|
meta_kms_crtc_get_id (crtc),
|
||||||
|
prop_id,
|
||||||
|
g_strerror (-ret));
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static gboolean
|
static gboolean
|
||||||
process_connector_update (MetaKmsImplDevice *impl_device,
|
process_connector_update (MetaKmsImplDevice *impl_device,
|
||||||
MetaKmsUpdate *update,
|
MetaKmsUpdate *update,
|
||||||
@ -268,6 +309,28 @@ process_connector_update (MetaKmsImplDevice *impl_device,
|
|||||||
return TRUE;
|
return TRUE;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static gboolean
|
||||||
|
process_crtc_update (MetaKmsImplDevice *impl_device,
|
||||||
|
MetaKmsUpdate *update,
|
||||||
|
gpointer update_entry,
|
||||||
|
GError **error)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update = update_entry;
|
||||||
|
MetaKmsCrtc *crtc = crtc_update->crtc;
|
||||||
|
|
||||||
|
if (crtc_update->vrr.has_update)
|
||||||
|
{
|
||||||
|
if (!set_crtc_property (impl_device,
|
||||||
|
crtc,
|
||||||
|
META_KMS_CRTC_PROP_VRR_ENABLED,
|
||||||
|
!!crtc_update->vrr.is_enabled,
|
||||||
|
error))
|
||||||
|
return FALSE;
|
||||||
|
}
|
||||||
|
|
||||||
|
return TRUE;
|
||||||
|
}
|
||||||
|
|
||||||
static CachedModeSet *
|
static CachedModeSet *
|
||||||
cached_mode_set_new (GList *connectors,
|
cached_mode_set_new (GList *connectors,
|
||||||
const drmModeModeInfo *drm_mode,
|
const drmModeModeInfo *drm_mode,
|
||||||
@ -1548,6 +1611,13 @@ meta_kms_impl_device_simple_process_update (MetaKmsImplDevice *impl_device,
|
|||||||
&error))
|
&error))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
if (!process_entries (impl_device,
|
||||||
|
update,
|
||||||
|
meta_kms_update_get_crtc_updates (update),
|
||||||
|
process_crtc_update,
|
||||||
|
&error))
|
||||||
|
goto err;
|
||||||
|
|
||||||
if (!process_plane_assignments (impl_device, update, &failed_planes, &error))
|
if (!process_plane_assignments (impl_device, update, &failed_planes, &error))
|
||||||
goto err;
|
goto err;
|
||||||
|
|
||||||
|
@ -117,6 +117,16 @@ typedef struct _MetaKmsConnectorUpdate
|
|||||||
} broadcast_rgb;
|
} broadcast_rgb;
|
||||||
} MetaKmsConnectorUpdate;
|
} MetaKmsConnectorUpdate;
|
||||||
|
|
||||||
|
typedef struct _MetaKmsCrtcUpdate
|
||||||
|
{
|
||||||
|
MetaKmsCrtc *crtc;
|
||||||
|
|
||||||
|
struct {
|
||||||
|
gboolean has_update;
|
||||||
|
gboolean is_enabled;
|
||||||
|
} vrr;
|
||||||
|
} MetaKmsCrtcUpdate;
|
||||||
|
|
||||||
typedef struct _MetaKmsPageFlipListener
|
typedef struct _MetaKmsPageFlipListener
|
||||||
{
|
{
|
||||||
gatomicrefcount ref_count;
|
gatomicrefcount ref_count;
|
||||||
@ -182,6 +192,9 @@ GList * meta_kms_update_get_page_flip_listeners (MetaKmsUpdate *update);
|
|||||||
META_EXPORT_TEST
|
META_EXPORT_TEST
|
||||||
GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
|
GList * meta_kms_update_get_connector_updates (MetaKmsUpdate *update);
|
||||||
|
|
||||||
|
META_EXPORT_TEST
|
||||||
|
GList * meta_kms_update_get_crtc_updates (MetaKmsUpdate *update);
|
||||||
|
|
||||||
META_EXPORT_TEST
|
META_EXPORT_TEST
|
||||||
GList * meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update);
|
GList * meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update);
|
||||||
|
|
||||||
|
@ -40,6 +40,7 @@ struct _MetaKmsUpdate
|
|||||||
GList *mode_sets;
|
GList *mode_sets;
|
||||||
GList *plane_assignments;
|
GList *plane_assignments;
|
||||||
GList *connector_updates;
|
GList *connector_updates;
|
||||||
|
GList *crtc_updates;
|
||||||
GList *crtc_color_updates;
|
GList *crtc_color_updates;
|
||||||
|
|
||||||
MetaKmsCustomPageFlip *custom_page_flip;
|
MetaKmsCustomPageFlip *custom_page_flip;
|
||||||
@ -481,6 +482,46 @@ meta_kms_update_set_broadcast_rgb (MetaKmsUpdate *update,
|
|||||||
connector_update->broadcast_rgb.value = rgb_range;
|
connector_update->broadcast_rgb.value = rgb_range;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static MetaKmsCrtcUpdate *
|
||||||
|
ensure_crtc_update (MetaKmsUpdate *update,
|
||||||
|
MetaKmsCrtc *crtc)
|
||||||
|
{
|
||||||
|
GList *l;
|
||||||
|
MetaKmsCrtcUpdate *crtc_update;
|
||||||
|
|
||||||
|
for (l = update->crtc_updates; l; l = l->next)
|
||||||
|
{
|
||||||
|
crtc_update = l->data;
|
||||||
|
|
||||||
|
if (crtc_update->crtc == crtc)
|
||||||
|
return crtc_update;
|
||||||
|
}
|
||||||
|
|
||||||
|
crtc_update = g_new0 (MetaKmsCrtcUpdate, 1);
|
||||||
|
crtc_update->crtc = crtc;
|
||||||
|
|
||||||
|
update->crtc_updates = g_list_prepend (update->crtc_updates,
|
||||||
|
crtc_update);
|
||||||
|
|
||||||
|
return crtc_update;
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
meta_kms_update_set_vrr (MetaKmsUpdate *update,
|
||||||
|
MetaKmsCrtc *crtc,
|
||||||
|
gboolean enabled)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update;
|
||||||
|
|
||||||
|
g_assert (meta_kms_crtc_get_device (crtc) == update->device);
|
||||||
|
|
||||||
|
crtc_update = ensure_crtc_update (update, crtc);
|
||||||
|
crtc_update->vrr.has_update = TRUE;
|
||||||
|
crtc_update->vrr.is_enabled = enabled;
|
||||||
|
|
||||||
|
update_latch_crtc (update, crtc);
|
||||||
|
}
|
||||||
|
|
||||||
static MetaKmsCrtcColorUpdate *
|
static MetaKmsCrtcColorUpdate *
|
||||||
ensure_color_update (MetaKmsUpdate *update,
|
ensure_color_update (MetaKmsUpdate *update,
|
||||||
MetaKmsCrtc *crtc)
|
MetaKmsCrtc *crtc)
|
||||||
@ -746,6 +787,12 @@ meta_kms_update_get_connector_updates (MetaKmsUpdate *update)
|
|||||||
return update->connector_updates;
|
return update->connector_updates;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
GList *
|
||||||
|
meta_kms_update_get_crtc_updates (MetaKmsUpdate *update)
|
||||||
|
{
|
||||||
|
return update->crtc_updates;
|
||||||
|
}
|
||||||
|
|
||||||
GList *
|
GList *
|
||||||
meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update)
|
meta_kms_update_get_crtc_color_updates (MetaKmsUpdate *update)
|
||||||
{
|
{
|
||||||
@ -921,6 +968,55 @@ merge_crtc_color_updates_from (MetaKmsUpdate *update,
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static GList *
|
||||||
|
find_crtc_update_link_for (MetaKmsUpdate *update,
|
||||||
|
MetaKmsCrtc *crtc)
|
||||||
|
{
|
||||||
|
GList *l;
|
||||||
|
|
||||||
|
for (l = update->crtc_updates; l; l = l->next)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update = l->data;
|
||||||
|
|
||||||
|
if (crtc_update->crtc == crtc)
|
||||||
|
return l;
|
||||||
|
}
|
||||||
|
|
||||||
|
return NULL;
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
merge_crtc_updates_from (MetaKmsUpdate *update,
|
||||||
|
MetaKmsUpdate *other_update)
|
||||||
|
{
|
||||||
|
while (other_update->crtc_updates)
|
||||||
|
{
|
||||||
|
GList *l = other_update->crtc_updates;
|
||||||
|
MetaKmsCrtcUpdate *other_crtc_update = l->data;
|
||||||
|
MetaKmsCrtc *crtc = other_crtc_update->crtc;
|
||||||
|
GList *el;
|
||||||
|
|
||||||
|
other_update->crtc_updates =
|
||||||
|
g_list_remove_link (other_update->crtc_updates, l);
|
||||||
|
|
||||||
|
el = find_crtc_update_link_for (update, crtc);
|
||||||
|
if (el)
|
||||||
|
{
|
||||||
|
MetaKmsCrtcUpdate *crtc_update = el->data;
|
||||||
|
|
||||||
|
if (other_crtc_update->vrr.has_update)
|
||||||
|
crtc_update->vrr = other_crtc_update->vrr;
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
update->crtc_updates =
|
||||||
|
g_list_insert_before_link (update->crtc_updates,
|
||||||
|
update->crtc_updates,
|
||||||
|
l);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
static GList *
|
static GList *
|
||||||
find_connector_update_link_for (MetaKmsUpdate *update,
|
find_connector_update_link_for (MetaKmsUpdate *update,
|
||||||
MetaKmsConnector *connector)
|
MetaKmsConnector *connector)
|
||||||
@ -1034,6 +1130,7 @@ meta_kms_update_merge_from (MetaKmsUpdate *update,
|
|||||||
|
|
||||||
merge_mode_sets (update, other_update);
|
merge_mode_sets (update, other_update);
|
||||||
merge_plane_assignments_from (update, other_update);
|
merge_plane_assignments_from (update, other_update);
|
||||||
|
merge_crtc_updates_from (update, other_update);
|
||||||
merge_crtc_color_updates_from (update, other_update);
|
merge_crtc_color_updates_from (update, other_update);
|
||||||
merge_connector_updates_from (update, other_update);
|
merge_connector_updates_from (update, other_update);
|
||||||
merge_custom_page_flip_from (update, other_update);
|
merge_custom_page_flip_from (update, other_update);
|
||||||
@ -1074,6 +1171,7 @@ meta_kms_update_free (MetaKmsUpdate *update)
|
|||||||
g_list_free_full (update->page_flip_listeners,
|
g_list_free_full (update->page_flip_listeners,
|
||||||
(GDestroyNotify) meta_kms_page_flip_listener_unref);
|
(GDestroyNotify) meta_kms_page_flip_listener_unref);
|
||||||
g_list_free_full (update->connector_updates, g_free);
|
g_list_free_full (update->connector_updates, g_free);
|
||||||
|
g_list_free_full (update->crtc_updates, g_free);
|
||||||
g_list_free_full (update->crtc_color_updates,
|
g_list_free_full (update->crtc_color_updates,
|
||||||
(GDestroyNotify) meta_kms_crtc_color_updates_free);
|
(GDestroyNotify) meta_kms_crtc_color_updates_free);
|
||||||
g_clear_pointer (&update->custom_page_flip, meta_kms_custom_page_flip_free);
|
g_clear_pointer (&update->custom_page_flip, meta_kms_custom_page_flip_free);
|
||||||
@ -1108,5 +1206,6 @@ meta_kms_update_is_empty (MetaKmsUpdate *update)
|
|||||||
return (!update->mode_sets &&
|
return (!update->mode_sets &&
|
||||||
!update->plane_assignments &&
|
!update->plane_assignments &&
|
||||||
!update->connector_updates &&
|
!update->connector_updates &&
|
||||||
|
!update->crtc_updates &&
|
||||||
!update->crtc_color_updates);
|
!update->crtc_color_updates);
|
||||||
}
|
}
|
||||||
|
@ -147,6 +147,11 @@ void meta_kms_update_mode_set (MetaKmsUpdate *update,
|
|||||||
GList *connectors,
|
GList *connectors,
|
||||||
MetaKmsMode *mode);
|
MetaKmsMode *mode);
|
||||||
|
|
||||||
|
META_EXPORT_TEST
|
||||||
|
void meta_kms_update_set_vrr (MetaKmsUpdate *update,
|
||||||
|
MetaKmsCrtc *crtc,
|
||||||
|
gboolean enabled);
|
||||||
|
|
||||||
META_EXPORT_TEST
|
META_EXPORT_TEST
|
||||||
void meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
|
void meta_kms_update_set_crtc_gamma (MetaKmsUpdate *update,
|
||||||
MetaKmsCrtc *crtc,
|
MetaKmsCrtc *crtc,
|
||||||
|
@ -111,6 +111,8 @@ assert_crtc_state_equals (const MetaKmsCrtcState *crtc_state1,
|
|||||||
crtc_state2->drm_mode.name);
|
crtc_state2->drm_mode.name);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
g_assert_true (crtc_state1->vrr_enabled == crtc_state2->vrr_enabled);
|
||||||
|
|
||||||
g_assert_true (meta_gamma_lut_equal (crtc_state1->gamma.value,
|
g_assert_true (meta_gamma_lut_equal (crtc_state1->gamma.value,
|
||||||
crtc_state2->gamma.value));
|
crtc_state2->gamma.value));
|
||||||
}
|
}
|
||||||
@ -208,6 +210,9 @@ copy_crtc_state (const MetaKmsCrtcState *crtc_state)
|
|||||||
g_assert_nonnull (crtc_state);
|
g_assert_nonnull (crtc_state);
|
||||||
|
|
||||||
new_state = *crtc_state;
|
new_state = *crtc_state;
|
||||||
|
|
||||||
|
new_state.vrr_enabled = crtc_state->vrr_enabled;
|
||||||
|
|
||||||
if (crtc_state->gamma.value)
|
if (crtc_state->gamma.value)
|
||||||
new_state.gamma.value = meta_gamma_lut_copy (crtc_state->gamma.value);
|
new_state.gamma.value = meta_gamma_lut_copy (crtc_state->gamma.value);
|
||||||
else
|
else
|
||||||
|
@ -95,6 +95,7 @@ meta_test_kms_update_sanity (void)
|
|||||||
g_assert_null (meta_kms_update_get_mode_sets (update));
|
g_assert_null (meta_kms_update_get_mode_sets (update));
|
||||||
g_assert_null (meta_kms_update_get_page_flip_listeners (update));
|
g_assert_null (meta_kms_update_get_page_flip_listeners (update));
|
||||||
g_assert_null (meta_kms_update_get_connector_updates (update));
|
g_assert_null (meta_kms_update_get_connector_updates (update));
|
||||||
|
g_assert_null (meta_kms_update_get_crtc_updates (update));
|
||||||
g_assert_null (meta_kms_update_get_crtc_color_updates (update));
|
g_assert_null (meta_kms_update_get_crtc_color_updates (update));
|
||||||
meta_kms_update_free (update);
|
meta_kms_update_free (update);
|
||||||
}
|
}
|
||||||
@ -430,6 +431,8 @@ meta_test_kms_update_merge (void)
|
|||||||
GList *plane_assignments;
|
GList *plane_assignments;
|
||||||
MetaKmsPlaneAssignment *plane_assignment;
|
MetaKmsPlaneAssignment *plane_assignment;
|
||||||
MetaGammaLut *crtc_gamma;
|
MetaGammaLut *crtc_gamma;
|
||||||
|
GList *crtc_updates;
|
||||||
|
MetaKmsCrtcUpdate *crtc_update;
|
||||||
GList *connector_updates;
|
GList *connector_updates;
|
||||||
MetaKmsConnectorUpdate *connector_update;
|
MetaKmsConnectorUpdate *connector_update;
|
||||||
|
|
||||||
@ -475,6 +478,10 @@ meta_test_kms_update_merge (void)
|
|||||||
meta_kms_plane_assignment_set_cursor_hotspot (cursor_plane_assignment,
|
meta_kms_plane_assignment_set_cursor_hotspot (cursor_plane_assignment,
|
||||||
10, 11);
|
10, 11);
|
||||||
|
|
||||||
|
meta_kms_update_set_vrr (update1,
|
||||||
|
crtc,
|
||||||
|
TRUE);
|
||||||
|
|
||||||
meta_kms_update_set_underscanning (update1,
|
meta_kms_update_set_underscanning (update1,
|
||||||
connector,
|
connector,
|
||||||
123, 456);
|
123, 456);
|
||||||
@ -605,6 +612,14 @@ meta_test_kms_update_merge (void)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
crtc_updates = meta_kms_update_get_crtc_updates (update1);
|
||||||
|
g_assert_cmpuint (g_list_length (crtc_updates), ==, 1);
|
||||||
|
crtc_update = crtc_updates->data;
|
||||||
|
g_assert_nonnull (crtc_update);
|
||||||
|
|
||||||
|
g_assert_true (crtc_update->vrr.has_update);
|
||||||
|
g_assert_true (crtc_update->vrr.is_enabled);
|
||||||
|
|
||||||
connector_updates = meta_kms_update_get_connector_updates (update1);
|
connector_updates = meta_kms_update_get_connector_updates (update1);
|
||||||
g_assert_cmpuint (g_list_length (connector_updates), ==, 1);
|
g_assert_cmpuint (g_list_length (connector_updates), ==, 1);
|
||||||
connector_update = connector_updates->data;
|
connector_update = connector_updates->data;
|
||||||
|
Loading…
Reference in New Issue
Block a user