[Intel-gfx] [PATCH 02/22] Xv i830_display_video splitup: extract i830_calc_src_regs

Ian Romanick idr at freedesktop.org
Thu Jul 2 18:33:11 CEST 2009


On Thu, Jul 02, 2009 at 02:15:35PM +0200, Daniel Vetter wrote:
> Also introduce an is_planar_fourcc helper. I'll use that one later.
> ---
>  src/i830_video.c |  113 +++++++++++++++++++++++++++++++-----------------------
>  1 files changed, 65 insertions(+), 48 deletions(-)
> 
> diff --git a/src/i830_video.c b/src/i830_video.c
> index e5be7e9..71da865 100644
> --- a/src/i830_video.c
> +++ b/src/i830_video.c
> @@ -1781,6 +1781,46 @@ i830_swidth (I830Ptr pI830, unsigned int offset,
>  }
>  
>  static void
> +i830_calc_src_regs(I830Ptr pI830, int planar, short width, short height,
> +	uint32_t *swidth_out, uint32_t *swidthsw_out, uint32_t *sheigth_out)
> +{
> +    unsigned int	mask, shift, offsety, offsetu;
> +    unsigned int	swidth, swidthy, swidthuv;
> +    I830PortPrivPtr	pPriv = pI830->adaptor->pPortPrivates[0].ptr;
> +
> +    if (IS_I9XX(pI830)) {
> +	shift = 6;
> +	mask = 0x3f;
> +    } else {
> +	shift = 5;
> +	mask = 0x1f;
> +    }
> +
> +    if (pPriv->currentBuf == 0) {
> +	offsety = pPriv->YBuf0offset;
> +	offsetu = pPriv->UBuf0offset;
> +    } else {
> +	offsety = pPriv->YBuf1offset;
> +	offsetu = pPriv->UBuf1offset;
> +    }
> +
> +    if (planar) {
> +	*swidth_out = width | ((width/2 & 0x7ff) << 16);
> +	swidthy  = i830_swidth (pI830, offsety, width, mask, shift);
> +	swidthuv = i830_swidth (pI830, offsetu, width/2, mask, shift);
> +	*swidthsw_out = (swidthy) | (swidthuv << 16);
> +	*sheigth_out = height | ((height / 2) << 16);
> +    } else {
> +	*swidth_out = width;
> +	swidth = i830_swidth (pI830, offsety, width << 1, mask, shift);
> +	*swidthsw_out = swidth;
> +	*sheigth_out = height;
> +    }

This will behave differently than the previous code for the case where id is
FOURCC_XVMC.  In the original code this would have been handled by the default
case of the switch-statement, which has become the else part of this
if-statement.  However, this will give planar=true, and it will be handled by
the if part of the if-statement.

So, the question is whether or not id can be FOURCC_XVMC at that part of
i830_display_video.  If it can be, was the original code correct?  If it
cannot be, when that case is encountered the code should give an error, or
assert, or something.

> +
> +    return;
> +}
> +
> +static void
>  i830_update_dst_box_to_crtc_coords(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
>  		BoxPtr dstBox)
>  {
> @@ -1832,6 +1872,23 @@ i830_update_dst_box_to_crtc_coords(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
>      return;
>  }
>  
> +static int
> +is_planar_fourcc(int id)
> +{
> +    switch (id) {
> +    case FOURCC_YV12:
> +    case FOURCC_I420:
> +#ifdef INTEL_XVMC
> +    case FOURCC_XVMC:
> +#endif
> +	return 1;
> +    case FOURCC_UYVY:
> +    case FOURCC_YUY2:
> +    default:
> +	return 0;
> +    }
> +}
> +
>  static void
>  i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
>  		   int id, short width, short height,
> @@ -1841,8 +1898,8 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
>      I830Ptr		pI830 = I830PTR(pScrn);
>      I830PortPrivPtr	pPriv = pI830->adaptor->pPortPrivates[0].ptr;
>      I830OverlayRegPtr	overlay = I830OVERLAYREG(pI830);
> -    unsigned int	swidth, swidthy, swidthuv;
> -    unsigned int	mask, shift, offsety, offsetu;
> +    int			planar;
> +    uint32_t		swidth, swidthsw, sheigth;
>      int			tmp;
>      uint32_t		OCMD;
>      Bool		scaleChanged = FALSE;
> @@ -1899,54 +1956,14 @@ i830_display_video(ScrnInfoPtr pScrn, xf86CrtcPtr crtc,
>  	drw_h = ((drw_h * pPriv->scaleRatio) >> 16) + 1;
>      }
>  
> -    if (IS_I9XX(pI830)) {
> -	shift = 6;
> -	mask = 0x3f;
> -    } else {
> -	shift = 5;
> -	mask = 0x1f;
> -    }
> -
> -    if (pPriv->currentBuf == 0) {
> -	offsety = pPriv->YBuf0offset;
> -	offsetu = pPriv->UBuf0offset;
> -    } else {
> -	offsety = pPriv->YBuf1offset;
> -	offsetu = pPriv->UBuf1offset;
> -    }
> -
> -    switch (id) {
> -    case FOURCC_YV12:
> -    case FOURCC_I420:
> -	overlay->SWIDTH = width | ((width/2 & 0x7ff) << 16);
> -	swidthy  = i830_swidth (pI830, offsety, width, mask, shift);
> -	swidthuv = i830_swidth (pI830, offsetu, width/2, mask, shift);
> -	overlay->SWIDTHSW = (swidthy) | (swidthuv << 16);
> -	overlay->SHEIGHT = height | ((height / 2) << 16);
> -	break;
> -    case FOURCC_UYVY:
> -    case FOURCC_YUY2:
> -    default:
> -	overlay->SWIDTH = width;
> -	swidth = ((offsety + (width << 1) + mask) >> shift) -
> -	(offsety >> shift);
> -
> -	if (IS_I9XX(pI830))
> -	    swidth <<= 1;
> +    planar = is_planar_fourcc(id);
>  
> -	swidth -= 1;
> +    i830_calc_src_regs(pI830, planar, width, height,
> +	    &swidth, &swidthsw, &sheigth);
>  
> -	swidth <<= 2;
> -	
> -	OVERLAY_DEBUG("swidthsw is old %d new %d\n",
> -		      swidth,
> -		      i830_swidth (pI830, offsety, width << 1,
> -				   mask, shift));
> -
> -	overlay->SWIDTHSW = swidth;
> -	overlay->SHEIGHT = height;
> -	break;
> -    }
> +    overlay->SWIDTH = swidth;
> +    overlay->SWIDTHSW = swidthsw;
> +    overlay->SHEIGHT = sheigth;
>  
>      overlay->DWINPOS = (dstBox->y1 << 16) | dstBox->x1;
>  
> -- 
> 1.6.3.3
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 197 bytes
Desc: Digital signature
URL: <http://lists.freedesktop.org/archives/intel-gfx/attachments/20090702/448cca06/attachment.sig>


More information about the Intel-gfx mailing list