[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