[PATCH] randr: Unify the core primary output and the xf86 compat output
Alex Deucher
alexdeucher at gmail.com
Mon Jan 11 06:55:24 PST 2010
On Fri, Jan 8, 2010 at 3:47 PM, Adam Jackson <ajax at redhat.com> wrote:
> These are logically the same thing, but RANDR didn't have a primary
> output concept until recently.
Yes please.
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
Reviewed-by: Alex Deucher <alexdeucher at gmail.com>
> ---
> hw/xfree86/common/xf86cmap.c | 10 +--
> hw/xfree86/modes/xf86Crtc.c | 137 ++++++++++++++++-----------------------
> hw/xfree86/modes/xf86Crtc.h | 18 +++--
> hw/xfree86/modes/xf86RandR12.c | 7 +-
> 4 files changed, 74 insertions(+), 98 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86cmap.c b/hw/xfree86/common/xf86cmap.c
> index 08f557c..1f4a1c6 100644
> --- a/hw/xfree86/common/xf86cmap.c
> +++ b/hw/xfree86/common/xf86cmap.c
> @@ -1001,8 +1001,7 @@ xf86ChangeGammaRamp(
> CMapLinkPtr pLink;
>
> if (xf86_crtc_supports_gamma(pScrn)) {
> - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> - RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
> + RRCrtcPtr crtc = xf86GetPrimaryCrtc(pScreen)->randr_crtc;
>
> if (crtc->gammaSize != size)
> return BadValue;
> @@ -1074,9 +1073,7 @@ xf86GetGammaRampSize(ScreenPtr pScreen)
> CMapScreenPtr pScreenPriv;
>
> if (xf86_crtc_supports_gamma(pScrn)) {
> - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> - RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
> -
> + RRCrtcPtr crtc = xf86GetPrimaryCrtc(pScreen)->randr_crtc;
> return crtc->gammaSize;
> }
>
> @@ -1103,8 +1100,7 @@ xf86GetGammaRamp(
> int shift, sigbits;
>
> if (xf86_crtc_supports_gamma(pScrn)) {
> - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> - RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
> + RRCrtcPtr crtc = xf86GetPrimaryCrtc(pScreen)->randr_crtc;
>
> if (crtc->gammaSize < size)
> return BadValue;
> diff --git a/hw/xfree86/modes/xf86Crtc.c b/hw/xfree86/modes/xf86Crtc.c
> index a420b63..c9dc960 100644
> --- a/hw/xfree86/modes/xf86Crtc.c
> +++ b/hw/xfree86/modes/xf86Crtc.c
> @@ -1796,88 +1796,58 @@ biggestMode(DisplayModePtr a, DisplayModePtr b)
> return b;
> }
>
> -static xf86OutputPtr
> -SetCompatOutput(xf86CrtcConfigPtr config)
> +/*
> + * vidmode modeset has to operate on something. give it the RANDR primary
> + * if defined, or else the first connected one. There might not be any,
> + * in which case modeset will just have to fail, since where else are we
> + * going to get a mode list from.
> + */
> +xf86OutputPtr
> +xf86GetPrimaryOutput(ScreenPtr pScreen)
> {
> - xf86OutputPtr output = NULL, test = NULL;
> - DisplayModePtr maxmode = NULL, testmode, mode;
> - int o, compat = -1, count, mincount = 0;
> + rrScrPrivPtr rrScrPriv = rrGetScrPriv(pScreen);
> + int i, j;
>
> - /* Look for one that's definitely connected */
> - for (o = 0; o < config->num_output; o++)
> - {
> - test = config->output[o];
> - if (!test->crtc)
> - continue;
> - if (test->status != XF86OutputStatusConnected)
> - continue;
> - if (!test->probed_modes)
> - continue;
> + /* defaults to NULL */
> + if (rrScrPriv->primaryOutput)
> + return rrScrPriv->primaryOutput->devPrivate;
>
> - testmode = mode = test->probed_modes;
> - for (count = 0; mode; mode = mode->next, count++)
> - testmode = biggestMode(testmode, mode);
> -
> - if (!output) {
> - output = test;
> - compat = o;
> - maxmode = testmode;
> - mincount = count;
> - } else if (maxmode == biggestMode(maxmode, testmode)) {
> - output = test;
> - compat = o;
> - maxmode = testmode;
> - mincount = count;
> - } else if ((maxmode->HDisplay == testmode->HDisplay) &&
> - (maxmode->VDisplay == testmode->VDisplay) &&
> - count <= mincount) {
> - output = test;
> - compat = o;
> - maxmode = testmode;
> - mincount = count;
> - }
> + for (i = 0; i < rrScrPriv->numCrtcs; i++) {
> + for (j = 0; j < rrScrPriv->crtcs[i]->numOutputs; j++) {
> + RROutputPtr output = rrScrPriv->crtcs[i]->outputs[j];
> + if (output->connection == RR_Connected)
> + return output->devPrivate;
> + }
> }
>
> - /* If we didn't find one, take anything we can get */
> - if (!output)
> - {
> - for (o = 0; o < config->num_output; o++)
> - {
> - test = config->output[o];
> - if (!test->crtc)
> - continue;
> - if (!test->probed_modes)
> - continue;
> + return NULL;
> +}
>
> - if (!output) {
> - output = test;
> - compat = o;
> - } else if (test->probed_modes->HDisplay < output->probed_modes->HDisplay) {
> - output = test;
> - compat = o;
> - }
> - }
> - }
> +/*
> + * vidmode gamma, however, operates on a CRTC, and those always exist. Pick
> + * the one attached to the vidmode primary output (as above), or else just
> + * the first one we've got.
> + */
> +xf86CrtcPtr
> +xf86GetPrimaryCrtc(ScreenPtr pScreen)
> +{
> + rrScrPrivPtr rrScrPriv = rrGetScrPriv(pScreen);
> + xf86OutputPtr output;
>
> - if (compat >= 0) {
> - config->compat_output = compat;
> - } else {
> - /* Don't change the compat output when no valid outputs found */
> - output = config->output[config->compat_output];
> - }
> + if ((output = xf86GetPrimaryOutput(pScreen)))
> + return output->randr_output->crtc->devPrivate;
>
> - return output;
> + return rrScrPriv->crtcs[0]->devPrivate;
> }
>
> void
> xf86SetScrnInfoModes (ScrnInfoPtr scrn)
> {
> - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
> xf86OutputPtr output;
> xf86CrtcPtr crtc;
> DisplayModePtr last, mode = NULL;
>
> - output = SetCompatOutput(config);
> + output = xf86GetPrimaryOutput(scrn->pScreen);
>
> if (!output)
> return; /* punt */
> @@ -2165,7 +2135,7 @@ xf86TargetFallback(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
> DisplayModePtr target_mode = NULL;
> Rotation target_rotation = RR_Rotate_0;
> DisplayModePtr default_mode;
> - int default_preferred, target_preferred = 0, o;
> + int o, default_preferred, target_preferred = 0, target_output = 0;
>
> /* User preferred > preferred > other modes */
> for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
> @@ -2180,12 +2150,12 @@ xf86TargetFallback(ScrnInfoPtr scrn, xf86CrtcConfigPtr config,
> target_mode = default_mode;
> target_preferred = default_preferred;
> target_rotation = config->output[o]->initial_rotation;
> - config->compat_output = o;
> + target_output = o;
> }
> }
>
> if (target_mode)
> - modes[config->compat_output] = target_mode;
> + modes[target_output] = target_mode;
>
> /* Fill in other output modes */
> for (o = -1; nextEnabledOutput(config, enabled, &o); ) {
> @@ -2577,7 +2547,7 @@ xf86SetDesiredModes (ScrnInfoPtr scrn)
>
> for (c = 0; c < config->num_crtc; c++)
> {
> - xf86OutputPtr output = NULL;
> + xf86OutputPtr output = NULL, primary_output;
> int o;
> RRTransformPtr transform;
>
> @@ -2587,8 +2557,9 @@ xf86SetDesiredModes (ScrnInfoPtr scrn)
> if (!crtc->enabled)
> continue;
>
> - if (config->output[config->compat_output]->crtc == crtc)
> - output = config->output[config->compat_output];
> + primary_output = xf86GetPrimaryOutput(scrn->pScreen);
> + if (primary_output && primary_output->crtc == crtc)
> + output = primary_output;
> else
> {
> for (o = 0; o < config->num_output; o++)
> @@ -2697,7 +2668,7 @@ xf86OutputFindClosestMode (xf86OutputPtr output, DisplayModePtr desired)
>
> /**
> * When setting a mode through XFree86-VidModeExtension or XFree86-DGA,
> - * take the specified mode and apply it to the crtc connected to the compat
> + * take the specified mode and apply it to the crtc connected to the primary
> * output. Then, find similar modes for the other outputs, as with the
> * InitialConfiguration code above. The goal is to clone the desired
> * mode across all outputs that are currently active.
> @@ -2708,16 +2679,19 @@ xf86SetSingleMode (ScrnInfoPtr pScrn, DisplayModePtr desired, Rotation rotation)
> {
> xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> Bool ok = TRUE;
> - xf86OutputPtr compat_output = config->output[config->compat_output];
> - DisplayModePtr compat_mode;
> + xf86OutputPtr primary_output = xf86GetPrimaryOutput(pScrn->pScreen);
> + DisplayModePtr primary_mode;
> int c;
>
> + if (!primary_output)
> + return FALSE;
> +
> /*
> * Let the compat output drive the final mode selection
> */
> - compat_mode = xf86OutputFindClosestMode (compat_output, desired);
> - if (compat_mode)
> - desired = compat_mode;
> + primary_mode = xf86OutputFindClosestMode (primary_output, desired);
> + if (primary_mode)
> + desired = primary_mode;
>
> for (c = 0; c < config->num_crtc; c++)
> {
> @@ -2923,6 +2897,7 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
> ScrnInfoPtr scrn = output->scrn;
> xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(scrn);
> Bool debug_modes = config->debug_modes || xf86Initialising;
> + rrScrPrivPtr rrScrPriv = rrGetScrPriv(scrn->pScreen);
> #ifdef RANDR_12_INTERFACE
> int size;
> #endif
> @@ -2938,8 +2913,8 @@ xf86OutputSetEDID (xf86OutputPtr output, xf86MonPtr edid_mon)
> xf86PrintEDID(edid_mon);
> }
>
> - /* Set the DDC properties for the 'compat' output */
> - if (output == config->output[config->compat_output])
> + /* if this is the primary output, set the screen properties */
> + if (output->randr_output == rrScrPriv->primaryOutput)
> xf86SetDDCproperties(scrn, edid_mon);
>
> #ifdef RANDR_12_INTERFACE
> diff --git a/hw/xfree86/modes/xf86Crtc.h b/hw/xfree86/modes/xf86Crtc.h
> index 9baa956..9e7babb 100644
> --- a/hw/xfree86/modes/xf86Crtc.h
> +++ b/hw/xfree86/modes/xf86Crtc.h
> @@ -631,13 +631,7 @@ typedef void (*xf86_crtc_notify_proc_ptr) (ScreenPtr pScreen);
> typedef struct _xf86CrtcConfig {
> int num_output;
> xf86OutputPtr *output;
> - /**
> - * compat_output is used whenever we deal
> - * with legacy code that only understands a single
> - * output. pScrn->modes will be loaded from this output,
> - * adjust frame will whack this output, etc.
> - */
> - int compat_output;
> + int unused;
>
> int num_crtc;
> xf86CrtcPtr *crtc;
> @@ -690,6 +684,16 @@ extern _X_EXPORT int xf86CrtcConfigPrivateIndex;
> #define XF86_CRTC_CONFIG_PTR(p) ((xf86CrtcConfigPtr) ((p)->privates[xf86CrtcConfigPrivateIndex].ptr))
>
> /*
> + * Compat functions
> + */
> +
> +extern _X_EXPORT xf86OutputPtr
> +xf86GetPrimaryOutput(ScreenPtr pScreen);
> +
> +extern _X_EXPORT xf86CrtcPtr
> +xf86GetPrimaryCrtc(ScreenPtr pScreen);
> +
> +/*
> * Initialize xf86CrtcConfig structure
> */
>
> diff --git a/hw/xfree86/modes/xf86RandR12.c b/hw/xfree86/modes/xf86RandR12.c
> index 1fc63c4..c7e57ae 100644
> --- a/hw/xfree86/modes/xf86RandR12.c
> +++ b/hw/xfree86/modes/xf86RandR12.c
> @@ -805,7 +805,8 @@ xf86RandR12CreateScreenResources (ScreenPtr pScreen)
> }
> else
> {
> - xf86OutputPtr output = config->output[config->compat_output];
> + rrScrPrivPtr rrScrPriv = rrGetScrPriv(pScreen);
> + xf86OutputPtr output = rrScrPriv->primaryOutput->devPrivate;
>
> if (output->conf_monitor &&
> (output->conf_monitor->mon_width > 0 &&
> @@ -1719,8 +1720,8 @@ xf86RandR12ChangeGamma(int scrnIndex, Gamma gamma)
> {
> CARD16 *points, *red, *green, *blue;
> ScrnInfoPtr pScrn = xf86Screens[scrnIndex];
> - xf86CrtcConfigPtr config = XF86_CRTC_CONFIG_PTR(pScrn);
> - RRCrtcPtr crtc = config->output[config->compat_output]->crtc->randr_crtc;
> + RRCrtcPtr crtc = xf86GetPrimaryCrtc(pScrn->pScreen)->randr_crtc;
> +
> int size = max(0, crtc->gammaSize);
>
> if (!size)
> --
> 1.6.5.2
>
> _______________________________________________
> xorg-devel mailing list
> xorg-devel at lists.x.org
> http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list