Don't change the max_bpc connector prop if mode=current.
As things are, even when mode=current is specified on the .ini file, a full modeset is needed (and done), which causes a very noticeable screen blinking. That is because setting the max_bpc on a connector needs full modesetting. The idea here is that if mode=current on the .ini, no modesetting should be done, so the current max_bpc is programmed into the connector. But if a custom max-bpc=... is specified, that will be used instead, even if mode=current on the .ini Fixes: https://gitlab.freedesktop.org/wayland/weston/-/issues/660 Signed-off-by: vanfanel <redwindwanderer@gmail.com> (cherry picked from commit 3240ccc69d1488003c1cfc36d23750145d4f13f7)
This commit is contained in:
@@ -517,6 +517,7 @@ struct drm_head {
|
||||
struct backlight *backlight;
|
||||
|
||||
drmModeModeInfo inherited_mode; /**< Original mode on the connector */
|
||||
uint32_t inherited_max_bpc; /**< Original max_bpc on the connector */
|
||||
uint32_t inherited_crtc_id; /**< Original CRTC assignment */
|
||||
};
|
||||
|
||||
|
||||
@@ -1388,6 +1388,12 @@ drm_head_read_current_setup(struct drm_head *head, struct drm_device *device)
|
||||
drmModeFreeCrtc(crtc);
|
||||
}
|
||||
|
||||
/* Get the current max_bpc that's currently configured to
|
||||
* this connector. */
|
||||
head->inherited_max_bpc = drm_property_get_value(
|
||||
&head->connector.props[WDRM_CONNECTOR_MAX_BPC],
|
||||
head->connector.props_drm, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@@ -912,20 +912,29 @@ drm_connector_set_max_bpc(struct drm_connector *connector,
|
||||
drmModeAtomicReq *req)
|
||||
{
|
||||
const struct drm_property_info *info;
|
||||
struct drm_head *head;
|
||||
struct drm_backend *backend = output->device->backend;
|
||||
uint64_t max_bpc;
|
||||
uint64_t a, b;
|
||||
|
||||
if (!drm_connector_has_prop(connector, WDRM_CONNECTOR_MAX_BPC))
|
||||
return 0;
|
||||
|
||||
info = &connector->props[WDRM_CONNECTOR_MAX_BPC];
|
||||
assert(info->flags & DRM_MODE_PROP_RANGE);
|
||||
assert(info->num_range_values == 2);
|
||||
a = info->range_values[0];
|
||||
b = info->range_values[1];
|
||||
assert(a <= b);
|
||||
if (output->max_bpc == 0) {
|
||||
/* A value of 0 means that the current max_bpc must be programmed. */
|
||||
head = drm_head_find_by_connector(backend, connector->connector_id);
|
||||
max_bpc = head->inherited_max_bpc;
|
||||
} else {
|
||||
info = &connector->props[WDRM_CONNECTOR_MAX_BPC];
|
||||
assert(info->flags & DRM_MODE_PROP_RANGE);
|
||||
assert(info->num_range_values == 2);
|
||||
a = info->range_values[0];
|
||||
b = info->range_values[1];
|
||||
assert(a <= b);
|
||||
|
||||
max_bpc = MAX(a, MIN(output->max_bpc, b));
|
||||
}
|
||||
|
||||
max_bpc = MAX(a, MIN(output->max_bpc, b));
|
||||
return connector_add_prop(req, connector,
|
||||
WDRM_CONNECTOR_MAX_BPC, max_bpc);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user