The checks for manual panel dimensions in xorg.conf should be executed before the BIOS check. Even after fixing this, PanelYRes is not guaranteed to be positive so we should be careful about dividing by it.
Signed-off-by: Connor Behan <[email protected]> --- src/r128_driver.c | 5 +++-- src/r128_video.c | 13 +++++++++---- 2 files changed, 12 insertions(+), 6 deletions(-) diff --git a/src/r128_driver.c b/src/r128_driver.c index 974e24d..67c741a 100644 --- a/src/r128_driver.c +++ b/src/r128_driver.c @@ -479,6 +479,9 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output) int FPHeader = 0; int i, j; + xf86GetOptValInteger(info->Options, OPTION_PANEL_WIDTH, &(r128_output->PanelXRes)); + xf86GetOptValInteger(info->Options, OPTION_PANEL_HEIGHT, &(r128_output->PanelYRes)); + if (!info->VBIOS) return; info->FPBIOSstart = 0; @@ -511,8 +514,6 @@ void R128GetPanelInfoFromBIOS(xf86OutputPtr output) } if (!info->FPBIOSstart) return; - xf86GetOptValInteger(info->Options, OPTION_PANEL_WIDTH, &(r128_output->PanelXRes)); - xf86GetOptValInteger(info->Options, OPTION_PANEL_HEIGHT, &(r128_output->PanelYRes)); if (!r128_output->PanelXRes) r128_output->PanelXRes = R128_BIOS16(info->FPBIOSstart + 25); diff --git a/src/r128_video.c b/src/r128_video.c index dc1f25b..59a6481 100644 --- a/src/r128_video.c +++ b/src/r128_video.c @@ -670,7 +670,7 @@ R128DisplayVideo422( int v_inc, h_inc, step_by, tmp, v_inc_shift; int p1_h_accum_init, p23_h_accum_init; int p1_v_accum_init; - Bool rmx_active; + Bool rmx_active = FALSE; R128ECP(pScrn, pPriv); @@ -680,7 +680,9 @@ R128DisplayVideo422( if (pScrn->currentMode->Flags & V_DBLSCAN) v_inc_shift--; - rmx_active = INREG(R128_FP_VERT_STRETCH) & R128_VERT_STRETCH_ENABLE; + if (r128_output->PanelYRes > 0) + rmx_active = INREG(R128_FP_VERT_STRETCH) & R128_VERT_STRETCH_ENABLE; + if (rmx_active) { v_inc = ((src_h * pScrn->currentMode->CrtcVDisplay / r128_output->PanelYRes) << v_inc_shift) / drw_h; } else { @@ -756,10 +758,11 @@ R128DisplayVideo420( R128OutputPrivatePtr r128_output = output->driver_private; unsigned char *R128MMIO = info->MMIO; R128PortPrivPtr pPriv = info->adaptor->pPortPrivates[0].ptr; + int v_inc, h_inc, step_by, tmp, leftUV, v_inc_shift; int p1_h_accum_init, p23_h_accum_init; int p1_v_accum_init, p23_v_accum_init; - Bool rmx_active; + Bool rmx_active = FALSE; v_inc_shift = 20; if (pScrn->currentMode->Flags & V_INTERLACE) @@ -767,7 +770,9 @@ R128DisplayVideo420( if (pScrn->currentMode->Flags & V_DBLSCAN) v_inc_shift--; - rmx_active = INREG(R128_FP_VERT_STRETCH) & R128_VERT_STRETCH_ENABLE; + if (r128_output->PanelYRes > 0) + rmx_active = INREG(R128_FP_VERT_STRETCH) & R128_VERT_STRETCH_ENABLE; + if (rmx_active) { v_inc = ((src_h * pScrn->currentMode->CrtcVDisplay / r128_output->PanelYRes) << v_inc_shift) / drw_h; } else { -- 2.0.2 _______________________________________________ xorg-driver-ati mailing list [email protected] http://lists.x.org/mailman/listinfo/xorg-driver-ati
