[PATCH] modes: improve aspect ratio match for classic drivers
Alex Deucher
alexdeucher at gmail.com
Mon Oct 4 13:43:41 PDT 2010
On Mon, Oct 4, 2010 at 3:59 PM, Adam Jackson <ajax at redhat.com> wrote:
> From: Olivier Fourdan <ofourdan at redhat.com>
>
> After we infer the aspect ratio for the screen, we pick the largest
> mode matching that aspect ratio from the best mode pool available.
> We then clamp virtual size to that mode, and run the resulting mode
> list through the driver's ValidMode hook. In doing so we might filter
> away our initial guess. If this happens we shrink the default mode
> to the next largest mode from _any_ mode pool. This is usually wrong,
> and we should instead pick the next aspect-matched mode from the best
> available mode pool (as always, user then driver then default).
>
> Originally reported as http://bugzilla.redhat.com/604057
>
> Signed-off-by: Adam Jackson <ajax at redhat.com>
Looks reasonable.
Reviewed-by: Alex Deucher <alexdeucher at gmail.com>
> ---
> hw/xfree86/common/xf86Mode.c | 64 ++++++++++++++++++++++++++++++++++++++---
> 1 files changed, 59 insertions(+), 5 deletions(-)
>
> diff --git a/hw/xfree86/common/xf86Mode.c b/hw/xfree86/common/xf86Mode.c
> index 7bdf79a..514a2e2 100644
> --- a/hw/xfree86/common/xf86Mode.c
> +++ b/hw/xfree86/common/xf86Mode.c
> @@ -1831,8 +1831,6 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
> numModes++;
> }
>
> -#undef _VIRTUALX
> -
> /*
> * If we estimated the virtual size above, we may have filtered away all
> * the modes that maximally match that size; scan again to find out and
> @@ -1847,13 +1845,69 @@ xf86ValidateModes(ScrnInfoPtr scrp, DisplayModePtr availModes,
> }
> }
> if (vx < virtX || vy < virtY) {
> + const int types[] = {
> + M_T_BUILTIN | M_T_PREFERRED,
> + M_T_BUILTIN,
> + M_T_DRIVER | M_T_PREFERRED,
> + M_T_DRIVER,
> + 0
> + };
> + const int ntypes = sizeof(types) / sizeof(int);
> + int n;
> +
> + /*
> + * We did not find the estimated virtual size. So now we want to
> + * find the largest mode available, but we want to search in the
> + * modes in the order of "types" listed above.
> + */
> + for (n = 0; n < ntypes; n++) {
> + int type = types[n];
> +
> + vx = 0; vy = 0;
> + for (p = scrp->modes; p; p = p->next) {
> + /* scan through the modes in the sort order above */
> + if ((p->type & type) != type)
> + continue;
> + if (p->HDisplay > vx && p->VDisplay > vy) {
> + vx = p->HDisplay;
> + vy = p->VDisplay;
> + }
> + }
> + if (vx && vy)
> + /* Found one */
> + break;
> + }
> xf86DrvMsg(scrp->scrnIndex, X_WARNING,
> "Shrinking virtual size estimate from %dx%d to %dx%d\n",
> virtX, virtY, vx, vy);
> - virtX = vx;
> + virtX = _VIRTUALX(vx);
> virtY = vy;
> - linePitch = scanLineWidth(vx, vy, minPitch, apertureSize,
> - BankFormat, pitchInc);
> + for (p = scrp->modes; p; p = p->next) {
> + if (numModes > 0) {
> + if (p->HDisplay > virtX)
> + p->status = MODE_VIRTUAL_X;
> + if (p->VDisplay > virtY)
> + p->status = MODE_VIRTUAL_Y;
> + if (p->status != MODE_OK) {
> + numModes--;
> + printModeRejectMessage(scrp->scrnIndex, p, p->status);
> + }
> + }
> + }
> + if (linePitches != NULL) {
> + for (i = 0; linePitches[i] != 0; i++) {
> + if ((linePitches[i] >= virtX) &&
> + (linePitches[i] ==
> + scanLineWidth(virtX, virtY, linePitches[i],
> + apertureSize, BankFormat, pitchInc))) {
> + linePitch = linePitches[i];
> + break;
> + }
> + }
> + } else {
> + linePitch = scanLineWidth(virtX, virtY, minPitch,
> + apertureSize, BankFormat, pitchInc);
> + }
> }
> }
>
> --
> 1.7.2.2
>
> _______________________________________________
> xorg-devel at lists.x.org: X.Org development
> Archives: http://lists.x.org/archives/xorg-devel
> Info: http://lists.x.org/mailman/listinfo/xorg-devel
>
More information about the xorg-devel
mailing list