diff options
author | Daniel Vetter <daniel.vetter@ffwll.ch> | 2009-07-02 14:15:37 +0200 |
---|---|---|
committer | Ian Romanick <ian.d.romanick@intel.com> | 2009-07-02 11:10:55 -0700 |
commit | 324b4686204feb3a7370eeecaff8ba44635f73ca (patch) | |
tree | 03f0cc8fd1773c80b7206956bdd081bc2bcaf7ab /src | |
parent | c2410addbfb99fcd7069591d9f387c35ed760522 (diff) |
Xv i830_display_video splitup: extract i830_update_scaling_factors
Just moved the code, no other changes.
Signed-off-by: Daniel Vetter <daniel.vetter@ffwll.ch>
Diffstat (limited to 'src')
-rw-r--r-- | src/i830_video.c | 169 |
1 files changed, 86 insertions, 83 deletions
diff --git a/src/i830_video.c b/src/i830_video.c index 58991a4f..c295159a 100644 --- a/src/i830_video.c +++ b/src/i830_video.c @@ -1887,6 +1887,90 @@ i830_update_polyphase_coeffs(I830OverlayRegPtr overlay, N_HORIZ_UV_TAPS); } +/* + * Calculate horizontal and vertical scaling factors and polyphase + * coefficients. + */ + +static Bool +i830_update_scaling_factors(I830OverlayRegPtr overlay, + short src_w, short src_h, short drw_w, short drw_h) +{ + int xscaleInt, xscaleFract, yscaleInt, yscaleFract; + int xscaleIntUV, xscaleFractUV; + int yscaleIntUV, yscaleFractUV; + uint32_t newval; + Bool scaleChanged = FALSE; + + /* + * Y down-scale factor as a multiple of 4096. + */ + xscaleFract = ((src_w - 1) << 12) / drw_w; + yscaleFract = ((src_h - 1) << 12) / drw_h; + + /* Calculate the UV scaling factor. + * UV is half the size of Y -- YUV420 */ + xscaleFractUV = xscaleFract / 2; + yscaleFractUV = yscaleFract / 2; + + /* + * To keep the relative Y and UV ratios exact, round the Y scales + * to a multiple of the Y/UV ratio. + */ + xscaleFract = xscaleFractUV * 2; + yscaleFract = yscaleFractUV * 2; + + /* Integer (un-multiplied) values. */ + xscaleInt = xscaleFract >> 12; + yscaleInt = yscaleFract >> 12; + + xscaleIntUV = xscaleFractUV >> 12; + yscaleIntUV = yscaleFractUV >> 12; + + OVERLAY_DEBUG("xscale: %x.%03x, yscale: %x.%03x\n", xscaleInt, + xscaleFract & 0xFFF, yscaleInt, yscaleFract & 0xFFF); + OVERLAY_DEBUG("UV xscale: %x.%03x, UV yscale: %x.%03x\n", xscaleIntUV, + xscaleFractUV & 0xFFF, yscaleIntUV, yscaleFractUV & 0xFFF); + + /* shouldn't get here */ + if (xscaleInt > 7) { + OVERLAY_DEBUG("xscale: bad scale\n"); + return FALSE; + } + + /* shouldn't get here */ + if (xscaleIntUV > 7) { + OVERLAY_DEBUG("xscaleUV: bad scale\n"); + return FALSE; + } + + newval = (xscaleInt << 16) | + ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); + if (newval != overlay->YRGBSCALE) { + scaleChanged = TRUE; + overlay->YRGBSCALE = newval; + } + + newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) | + ((yscaleFractUV & 0xFFF) << 20); + if (newval != overlay->UVSCALE) { + scaleChanged = TRUE; + overlay->UVSCALE = newval; + } + + newval = yscaleInt << 16 | yscaleIntUV; + if (newval != overlay->UVSCALEV) { + scaleChanged = TRUE; + overlay->UVSCALEV = newval; + } + + if (scaleChanged) { + i830_update_polyphase_coeffs(overlay, xscaleFract, xscaleFractUV); + } + + return scaleChanged; +} + static void i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, int id, short width, short height, @@ -2025,89 +2109,8 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc, overlay->DWINPOS, overlay->DWINSZ); OVERLAY_DEBUG("dst: %d x %d, src: %d x %d\n", drw_w, drw_h, src_w, src_h); - /* - * Calculate horizontal and vertical scaling factors and polyphase - * coefficients. - */ - - { - int xscaleInt, xscaleFract, yscaleInt, yscaleFract; - int xscaleIntUV, xscaleFractUV; - int yscaleIntUV, yscaleFractUV; - /* UV is half the size of Y -- YUV420 */ - int uvratio = 2; - uint32_t newval; - - /* - * Y down-scale factor as a multiple of 4096. - */ - xscaleFract = ((src_w - 1) << 12) / drw_w; - yscaleFract = ((src_h - 1) << 12) / drw_h; - - /* Calculate the UV scaling factor. */ - xscaleFractUV = xscaleFract / uvratio; - yscaleFractUV = yscaleFract / uvratio; - - /* - * To keep the relative Y and UV ratios exact, round the Y scales - * to a multiple of the Y/UV ratio. - */ - xscaleFract = xscaleFractUV * uvratio; - yscaleFract = yscaleFractUV * uvratio; - - /* Integer (un-multiplied) values. */ - xscaleInt = xscaleFract >> 12; - yscaleInt = yscaleFract >> 12; - - xscaleIntUV = xscaleFractUV >> 12; - yscaleIntUV = yscaleFractUV >> 12; - - OVERLAY_DEBUG("xscale: %x.%03x, yscale: %x.%03x\n", xscaleInt, - xscaleFract & 0xFFF, yscaleInt, yscaleFract & 0xFFF); - OVERLAY_DEBUG("UV xscale: %x.%03x, UV yscale: %x.%03x\n", xscaleIntUV, - xscaleFractUV & 0xFFF, yscaleIntUV, yscaleFractUV & 0xFFF); - - /* shouldn't get here */ - if (xscaleInt > 7) { - OVERLAY_DEBUG("xscale: bad scale\n"); - return; - } - - /* shouldn't get here */ - if (xscaleIntUV > 7) { - OVERLAY_DEBUG("xscaleUV: bad scale\n"); - return; - } - - newval = (xscaleInt << 16) | - ((xscaleFract & 0xFFF) << 3) | ((yscaleFract & 0xFFF) << 20); - if (newval != overlay->YRGBSCALE) { - scaleChanged = TRUE; - overlay->YRGBSCALE = newval; - } - - newval = (xscaleIntUV << 16) | ((xscaleFractUV & 0xFFF) << 3) | - ((yscaleFractUV & 0xFFF) << 20); - if (newval != overlay->UVSCALE) { - scaleChanged = TRUE; - overlay->UVSCALE = newval; - } - - newval = yscaleInt << 16 | yscaleIntUV; - if (newval != overlay->UVSCALEV) { - scaleChanged = TRUE; - overlay->UVSCALEV = newval; - } - - /* Recalculate coefficients if the scaling changed. */ - - /* - * Only Horizontal coefficients so far. - */ - if (scaleChanged) { - i830_update_polyphase_coeffs(overlay, xscaleFract, xscaleFractUV); - } - } + scaleChanged = i830_update_scaling_factors(overlay, + src_w, src_h, drw_w, drw_h); OCMD = OVERLAY_ENABLE; |