[Spice-devel] [PATCH] Update drm properties correctly

Marc-André Lureau mlureau at redhat.com
Thu Nov 6 15:59:58 PST 2014



----- Original Message -----
> When connector properties got changed, those changes were not being
> propagated to user-space. This pushes those chagnes up so that e.g. new
> suggested_x|y properties can be used to help lay out multiple displays
> properly. This code is based on similar code from the nouveau driver.
> ---
>  src/qxl_drmmode.c | 54
>  +++++++++++++++++++++++++++++++++++++++++++++++++++++-
>  1 file changed, 53 insertions(+), 1 deletion(-)
> 
> diff --git a/src/qxl_drmmode.c b/src/qxl_drmmode.c
> index b7ea7d1..899eefd 100644
> --- a/src/qxl_drmmode.c
> +++ b/src/qxl_drmmode.c
> @@ -640,7 +640,59 @@ drmmode_output_set_property(xf86OutputPtr output, Atom
> property,
>  static Bool
>  drmmode_output_get_property(xf86OutputPtr output, Atom property)
>  {
> -    return TRUE;
> +    drmmode_output_private_ptr drmmode_output = output->driver_private;
> +    drmmode_ptr drmmode = drmmode_output->drmmode;
> +    uint32_t value;
> +    int err, i;
> +
> +    if (output->scrn->vtSema) {
> +	drmModeFreeConnector(drmmode_output->mode_output);
> +	drmmode_output->mode_output =
> +	    drmModeGetConnector(drmmode->fd, drmmode_output->output_id);
> +    }
> +
> +    if (!drmmode_output->mode_output)
> +	return FALSE;

This line is different, is this a normal condition? If not, shouldn't be a warning?

> +
> +    for (i = 0; i < drmmode_output->num_props; i++) {
> +	int n;
> +	drmmode_prop_ptr p = &drmmode_output->props[i];
> +	if (p->atoms[0] != property)
> +	    continue;
> +
> +	for (n = 0; n < drmmode_output->mode_output->count_props; n++) {
> +	    int id = drmmode_output->mode_output->props[n];
> +	    if (id == p->mode_prop->prop_id) {
> +		value = drmmode_output->mode_output->prop_values[n];

and here, nouveau seems to use the p->index to access the value directly.

> +		break;
> +	    }
> +	}
> +
> +	if (p->mode_prop->flags & DRM_MODE_PROP_RANGE) {
> +	    err = RRChangeOutputProperty(output->randr_output,
> +					 property, XA_INTEGER, 32,
> +					 PropModeReplace, 1, &value,
> +					 FALSE, FALSE);
> +
> +	    return !err;
> +	} else if (p->mode_prop->flags & DRM_MODE_PROP_ENUM) {
> +	    int     j;
> +
> +	    /* search for matching name string, then set its value down */
> +	    for (j = 0; j < p->mode_prop->count_enums; j++) {
> +		if (p->mode_prop->enums[j].value == value)
> +		    break;
> +	    }
> +
> +	    err = RRChangeOutputProperty(output->randr_output, property,
> +					 XA_ATOM, 32, PropModeReplace, 1,
> +					 &p->atoms[j+1], FALSE, FALSE);
> +
> +	    return !err;
> +	}
> +    }
> +
> +    return FALSE;
>  }

looks ok otherwise

>  
>  static const xf86OutputFuncsRec drmmode_output_funcs = {
> --
> 1.9.3
> 
> _______________________________________________
> Spice-devel mailing list
> Spice-devel at lists.freedesktop.org
> http://lists.freedesktop.org/mailman/listinfo/spice-devel
> 


More information about the xorg-devel mailing list