diff options
Diffstat (limited to 'src/atimach64xv.c')
-rw-r--r-- | src/atimach64xv.c | 1493 |
1 files changed, 0 insertions, 1493 deletions
diff --git a/src/atimach64xv.c b/src/atimach64xv.c deleted file mode 100644 index d45e306..0000000 --- a/src/atimach64xv.c +++ /dev/null @@ -1,1493 +0,0 @@ -/* $XFree86: xc/programs/Xserver/hw/xfree86/drivers/ati/atimach64xv.c,v 1.6 2003/07/19 15:26:54 tsi Exp $ */ -/* - * Copyright 2003 by Marc Aurele La France (TSI @ UQV), tsi@xfree86.org - * - * Permission to use, copy, modify, distribute, and sell this software and its - * documentation for any purpose is hereby granted without fee, provided that - * the above copyright notice appear in all copies and that both that copyright - * notice and this permission notice appear in supporting documentation, and - * that the name of Marc Aurele La France not be used in advertising or - * publicity pertaining to distribution of the software without specific, - * written prior permission. Marc Aurele La France makes no representations - * about the suitability of this software for any purpose. It is provided - * "as-is" without express or implied warranty. - * - * MARC AURELE LA FRANCE DISCLAIMS ALL WARRANTIES WITH REGARD TO THIS SOFTWARE, - * INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO - * EVENT SHALL MARC AURELE LA FRANCE BE LIABLE FOR ANY SPECIAL, INDIRECT OR - * CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS OF USE, - * DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR OTHER - * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR - * PERFORMANCE OF THIS SOFTWARE. - */ - -#include "ati.h" -#include "atiaccel.h" -#include "atichip.h" -#include "atimach64accel.h" -#include "atimach64io.h" -#include "atimach64xv.h" - -#include "Xv.h" -#include "fourcc.h" - -#define MAKE_ATOM(string) MakeAtom(string, strlen(string), TRUE) -#define MaxScale (CARD32)(CARD16)(-1) - -static unsigned long ATIMach64XVAtomGeneration = (unsigned long)(-1); - -static XF86VideoEncodingRec ATIMach64VideoEncoding_A[] = -{ - { 0, "XV_IMAGE", 384, 2048, {1, 1} } -}; -#define nATIMach64VideoEncoding_A NumberOf(ATIMach64VideoEncoding_A) - -static XF86VideoEncodingRec ATIMach64VideoEncoding_B[] = -{ - { 0, "XV_IMAGE", 720, 2048, {1, 1} } -}; -#define nATIMach64VideoEncoding_B NumberOf(ATIMach64VideoEncoding_B) - -/* nATIMach64VideoEncoding_[AB] should be equal */ -#define nATIMach64VideoEncoding nATIMach64VideoEncoding_A - -static XF86VideoFormatRec ATIMach64VideoFormat[] = -{ - { 8, TrueColor}, - { 8, DirectColor}, - { 8, PseudoColor}, - { 8, GrayScale}, - { 8, StaticGray}, - { 8, StaticColor}, - {15, TrueColor}, - {16, TrueColor}, - {24, TrueColor}, - {15, DirectColor}, - {16, DirectColor}, - {24, DirectColor} -}; -#define nATIMach64VideoFormat NumberOf(ATIMach64VideoFormat) - -static XF86AttributeRec ATIMach64Attribute[] = -{ - /* These are only supported on the Rage Pro and later ... */ - { - XvSettable | XvGettable, - -1000, 1000, - "XV_SATURATION" - }, - { - XvSettable | XvGettable, - -1000, 1000, - "XV_BRIGHTNESS" - }, - { - XvSettable | XvGettable, - -1000, 1000, - "XV_COLOUR" - }, - { - XvSettable | XvGettable, - -1000, 1000, - "XV_COLOR" - }, - - /* Local attributes, odds and ends for compatibility, etc... */ - { - XvSettable | XvGettable, - 0, 1, - "XV_AUTOPAINT_COLOURKEY" - }, - { - XvSettable | XvGettable, - 0, 1, - "XV_AUTOPAINT_COLORKEY" - }, - { - XvSettable | XvGettable, - 0, (1 << 24) - 1, - "XV_COLOURKEY" - }, - { - XvSettable | XvGettable, - 0, (1 << 24) - 1, - "XV_COLORKEY" - }, - { - XvSettable | XvGettable, - 0, (1 << 24) - 1, - "XV_COLOURKEY_MASK" - }, - { - XvSettable | XvGettable, - 0, (1 << 24) - 1, - "XV_COLORKEY_MASK" - }, - { - XvSettable, - 0, 0, - "XV_SET_DEFAULTS" - }, - { /* Keep last */ - XvSettable | XvGettable, - 0, 1, - "XV_DOUBLE_BUFFER" - } -}; -#define nATIMach64Attribute NumberOf(ATIMach64Attribute) - -static XF86ImageRec ATIMach64Image[] = -{ - XVIMAGE_YUY2, - XVIMAGE_UYVY, - XVIMAGE_YV12, - XVIMAGE_I420 -}; -#define nATIMach64Image NumberOf(ATIMach64Image) - -/* A local XVideo adaptor attribute record */ -typedef struct _ATIMach64Attribute -{ - Atom AttributeID; - INT32 MaxValue; /* ... for the hardware */ - void (*SetAttribute) NestedPrototype((ATIPtr, INT32)); - INT32 (*GetAttribute) NestedPrototype((ATIPtr)); -} ATIMach64AttributeRec, *ATIMach64AttributePtr; - -/* Functions to get/set XVideo adaptor attributes */ - -static void -ATIMach64SetSaturationAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - /* Set the register */ - pATI->NewHW.scaler_colour_cntl &= - ~(SCALE_SATURATION_U | SCALE_SATURATION_V); - pATI->NewHW.scaler_colour_cntl |= SetBits(Value, SCALE_SATURATION_U) | - SetBits(Value, SCALE_SATURATION_V); - outf(SCALER_COLOUR_CNTL, pATI->NewHW.scaler_colour_cntl); -} - -static INT32 -ATIMach64GetSaturationAttribute -( - ATIPtr pATI -) -{ - return (INT32)GetBits(pATI->NewHW.scaler_colour_cntl, SCALE_SATURATION_U); -} - -static void -ATIMach64SetBrightnessAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - /* Set the register */ - pATI->NewHW.scaler_colour_cntl &= ~SCALE_BRIGHTNESS; - pATI->NewHW.scaler_colour_cntl |= SetBits(Value, SCALE_BRIGHTNESS); - outf(SCALER_COLOUR_CNTL, pATI->NewHW.scaler_colour_cntl); -} - -static INT32 -ATIMach64GetBrightnessAttribute -( - ATIPtr pATI -) -{ - return (INT32)GetBits(pATI->NewHW.scaler_colour_cntl, SCALE_BRIGHTNESS); -} - -static void -ATIMach64SetDoubleBufferAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - pATI->DoubleBuffer = Value; -} - -static INT32 -ATIMach64GetDoubleBufferAttribute -( - ATIPtr pATI -) -{ - return (int)pATI->DoubleBuffer; -} - -static void -ATIMach64SetAutoPaintAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - pATI->AutoPaint = Value; -} - -static INT32 -ATIMach64GetAutoPaintAttribute -( - ATIPtr pATI -) -{ - return (int)pATI->AutoPaint; -} - -static void -ATIMach64SetColourKeyAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - pATI->NewHW.overlay_graphics_key_clr = - (CARD32)(Value & ((1 << pATI->depth) - 1)); - outf(OVERLAY_GRAPHICS_KEY_CLR, pATI->NewHW.overlay_graphics_key_clr); -} - -static INT32 -ATIMach64GetColourKeyAttribute -( - ATIPtr pATI -) -{ - return (INT32)pATI->NewHW.overlay_graphics_key_clr; -} - -static void -ATIMach64SetColourKeyMaskAttribute -( - ATIPtr pATI, - INT32 Value -) -{ - pATI->NewHW.overlay_graphics_key_msk = - (CARD32)(Value & ((1 << pATI->depth) - 1)); - outf(OVERLAY_GRAPHICS_KEY_MSK, pATI->NewHW.overlay_graphics_key_msk); -} - -static INT32 -ATIMach64GetColourKeyMaskAttribute -( - ATIPtr pATI -) -{ - return (INT32)pATI->NewHW.overlay_graphics_key_msk; -} - -/* - * ATIMach64SetDefaultAttributes -- - * - * This function calls other functions to set default values for the various - * attributes of an XVideo port. - */ -static void -ATIMach64SetDefaultAttributes -( - ATIPtr pATI, - INT32 Value -) -{ - ATIMach64SetAutoPaintAttribute(pATI, TRUE); - ATIMach64SetDoubleBufferAttribute(pATI, FALSE); - ATIMach64SetColourKeyMaskAttribute(pATI, (1 << pATI->depth) - 1); - ATIMach64SetColourKeyAttribute(pATI, (3 << ((2 * pATI->depth) / 3)) | - (2 << ((1 * pATI->depth) / 3)) | - (1 << ((0 * pATI->depth) / 3))); - - if (pATI->Chip < ATI_CHIP_264GTPRO) - return; - - ATIMach64SetBrightnessAttribute(pATI, 32); - ATIMach64SetSaturationAttribute(pATI, 16); -} - -/* - * There is a one-to-one correspondance between elements of the following array - * and those of ATIMach64Attribute. - */ -static ATIMach64AttributeRec ATIMach64AttributeInfo[nATIMach64Attribute] = -{ - { /* SATURATION */ - 0, 23, - ATIMach64SetSaturationAttribute, - ATIMach64GetSaturationAttribute - }, - { /* BRIGHTNESS */ - 0, 63, - ATIMach64SetBrightnessAttribute, - ATIMach64GetBrightnessAttribute - }, - { /* COLOUR */ - 0, 23, - ATIMach64SetSaturationAttribute, - ATIMach64GetSaturationAttribute - }, - { /* COLOR */ - 0, 23, - ATIMach64SetSaturationAttribute, - ATIMach64GetSaturationAttribute - }, - { /* AUTOPAINT_COLOURKEY */ - 0, 1, - ATIMach64SetAutoPaintAttribute, - ATIMach64GetAutoPaintAttribute - }, - { /* AUTOPAINT_COLORKEY */ - 0, 1, - ATIMach64SetAutoPaintAttribute, - ATIMach64GetAutoPaintAttribute - }, - { /* COLOURKEY */ - 0, (1 << 24) - 1, - ATIMach64SetColourKeyAttribute, - ATIMach64GetColourKeyAttribute - }, - { /* COLORKEY */ - 0, (1 << 24) - 1, - ATIMach64SetColourKeyAttribute, - ATIMach64GetColourKeyAttribute - }, - { /* COLOURKEY_MASK */ - 0, (1 << 24) - 1, - ATIMach64SetColourKeyMaskAttribute, - ATIMach64GetColourKeyMaskAttribute - }, - { /* COLORKEY_MASK */ - 0, (1 << 24) - 1, - ATIMach64SetColourKeyMaskAttribute, - ATIMach64GetColourKeyMaskAttribute - }, - { /* SET_DEFAULTS */ - 0, 0, - ATIMach64SetDefaultAttributes, - NULL - }, - { /* DOUBLE_BUFFER */ - 0, 1, - ATIMach64SetDoubleBufferAttribute, - ATIMach64GetDoubleBufferAttribute - } -}; - -/* - * ATIMach64FindAttribute -- - * - * This function is called to locate an Xv attribute's table entry. - */ -static int -ATIMach64FindPortAttribute -( - ATIPtr pATI, - Atom AttributeID -) -{ - int iAttribute; - - if (pATI->Chip < ATI_CHIP_264GTPRO) - iAttribute = 4; - else - iAttribute = 0; - - for (; iAttribute < nATIMach64Attribute; iAttribute++) - if (AttributeID == ATIMach64AttributeInfo[iAttribute].AttributeID) - return iAttribute; - - return -1; -} - -/* - * ATIMach64SetPortAttribute -- - * - * This function sets the value of a particular port's attribute. - */ -static int -ATIMach64SetPortAttribute -( - ScrnInfoPtr pScreenInfo, - Atom AttributeID, - INT32 Value, - pointer pATI -) -{ - INT32 Range; - int iAttribute; - - if (((iAttribute = ATIMach64FindPortAttribute(pATI, AttributeID)) < 0) || - !ATIMach64AttributeInfo[iAttribute].SetAttribute) - return BadMatch; - - Range = ATIMach64Attribute[iAttribute].max_value - - ATIMach64Attribute[iAttribute].min_value; - - if (Range >= 0) - { - /* Limit and scale the value */ - Value -= ATIMach64Attribute[iAttribute].min_value; - - if (Value < 0) - Value = 0; - else if (Value > Range) - Value = Range; - - if (Range != ATIMach64AttributeInfo[iAttribute].MaxValue) - { - if (ATIMach64AttributeInfo[iAttribute].MaxValue > 0) - Value *= ATIMach64AttributeInfo[iAttribute].MaxValue; - if (Range > 0) - Value /= Range; - } - } - - (*ATIMach64AttributeInfo[iAttribute].SetAttribute)(pATI, Value); - - return Success; -} - -/* - * ATIMach64SetPortAttribute -- - * - * This function retrieves the value of a particular port's attribute. - */ -static int -ATIMach64GetPortAttribute -( - ScrnInfoPtr pScreenInfo, - Atom AttributeID, - INT32 *Value, - pointer pATI -) -{ - INT32 Range; - int iAttribute; - - if (!Value || - ((iAttribute = ATIMach64FindPortAttribute(pATI, AttributeID)) < 0) || - !ATIMach64AttributeInfo[iAttribute].GetAttribute) - return BadMatch; - - *Value = (*ATIMach64AttributeInfo[iAttribute].GetAttribute)(pATI); - - Range = ATIMach64Attribute[iAttribute].max_value - - ATIMach64Attribute[iAttribute].min_value; - - if (Range >= 0) - { - if (Range != ATIMach64AttributeInfo[iAttribute].MaxValue) - { - /* (Un-)scale the value */ - if (Range > 0) - *Value *= Range; - if (ATIMach64AttributeInfo[iAttribute].MaxValue > 0) - *Value /= ATIMach64AttributeInfo[iAttribute].MaxValue; - } - - *Value += ATIMach64Attribute[iAttribute].min_value; - } - - return Success; -} - -/* - * ATIMach64RemoveLinearCallback -- - * - * This is called by the framebuffer manager to release the offscreen XVideo - * buffer after the video has been temporarily disabled due to its window being - * iconified or completely occluded. - */ -static void -ATIMach64RemoveLinearCallback -( - FBLinearPtr pLinear -) -{ - ATIPtr pATI = ATIPTR(xf86Screens[pLinear->pScreen->myNum]); - - pATI->pXVBuffer = NULL; - outf(OVERLAY_SCALE_CNTL, SCALE_EN); -} - -/* - * ATIMach64StopVideo -- - * - * This is called to stop displaying a video. Note that, to prevent jittering - * this doesn't actually turn off the overlay unless 'Cleanup' is TRUE, i.e. - * when the video is to be actually stopped rather than temporarily disabled. - */ -static void -ATIMach64StopVideo -( - ScrnInfoPtr pScreenInfo, - pointer Data, - Bool Cleanup -) -{ - ScreenPtr pScreen = pScreenInfo->pScreen; - ATIPtr pATI = Data; - - if (pATI->ActiveSurface) - return; - - REGION_EMPTY(pScreen, &pATI->VideoClip); - - if (!Cleanup) - { - /* - * Free offscreen buffer if/when its allocation is needed by XAA's - * pixmap cache. - */ - if (pATI->pXVBuffer) - pATI->pXVBuffer->RemoveLinearCallback = - ATIMach64RemoveLinearCallback; - return; - } - - pATI->pXVBuffer = ATIResizeOffscreenLinear(pScreen, pATI->pXVBuffer, 0); - outf(OVERLAY_SCALE_CNTL, SCALE_EN); -} - -/* - * ATIMach64QueryBestSize -- - * - * Quoting XVideo docs: - * - * This function provides the client with a way to query what the destination - * dimensions would end up being if they were to request that an area - * VideoWidth by VideoHeight from the video stream be scaled to rectangle of - * DrawableWidth by DrawableHeight on the screen. Since it is not expected - * that all hardware will be able to get the target dimensions exactly, it is - * important that the driver provide this function. - */ -static void -ATIMach64QueryBestSize -( - ScrnInfoPtr pScreenInfo, - Bool Motion, - short VideoWidth, - short VideoHeight, - short DrawableWidth, - short DrawableHeight, - unsigned int *Width, - unsigned int *Height, - pointer pATI -) -{ - *Width = DrawableWidth; - *Height = DrawableHeight; -} - -/* - * ATIMach64QueryImageAttributes -- - * - * Quoting XVideo docs: - * - * This function is called to let the driver specify how data for a particular - * image of size Width by Height should be stored. Sometimes only the size and - * corrected width and height are needed. In that case pitches and offsets are - * NULL. The size of the memory required for the image is returned by this - * function. The width and height of the requested image can be altered by the - * driver to reflect format limitations (such as component sampling periods - * that are larger than one). If pPitch and pOffset are not NULL, these will - * be arrays with as many elements in them as there are planes in the image - * format. The driver should specify the pitch (in bytes) of each scanline in - * the particular plane as well as the offset to that plane (in bytes) from the - * beginning of the image. - */ -static int -ATIMach64QueryImageAttributes -( - ScrnInfoPtr pScreenInfo, - int ImageID, - unsigned short *Width, - unsigned short *Height, - int *pPitch, - int *pOffset -) -{ - int Size, tmp; - - if (!Width || !Height) - return 0; - - if (*Width > 2048) - *Width = 2048; - else - *Width = (*Width + 1) & ~1; - - if (*Height > 2048) - *Height = 2048; - - if (pOffset) - pOffset[0] = 0; - - switch (ImageID) - { - case FOURCC_YV12: - case FOURCC_I420: - *Height = (*Height + 1) & ~1; - Size = (*Width + 3) & ~3; - if (pPitch) - pPitch[0] = Size; - Size *= *Height; - if (pOffset) - pOffset[1] = Size; - tmp = ((*Width >> 1) + 3) & ~3; - if (pPitch) - pPitch[1] = pPitch[2] = tmp; - tmp *= (*Height >> 1); - Size += tmp; - if (pOffset) - pOffset[2] = Size; - Size += tmp; - break; - - case FOURCC_UYVY: - case FOURCC_YUY2: - Size = *Width << 1; - if (pPitch) - pPitch[0] = Size; - Size *= *Height; - break; - - default: - Size = 0; - break; - } - - return Size; -} - -/* - * ATIMach64ScaleVideo -- - * - * This function is called to calculate overlay scaling factors. - */ -static void -ATIMach64ScaleVideo -( - ATIPtr pATI, - DisplayModePtr pMode, - int SrcW, - int SrcH, - int DstW, - int DstH, - CARD32 *pHScale, - CARD32 *pVScale -) -{ - int Shift; - - *pHScale = ATIDivide(SrcW, DstW, - GetBits(pATI->NewHW.pll_vclk_cntl, PLL_ECP_DIV) + 12, 0); - - Shift = 12; - if (pMode->Flags & V_INTERLACE) - Shift++; - - if (pATI->OptionPanelDisplay && (pATI->LCDPanelID >= 0)) - { - if (pMode->VDisplay < pATI->LCDVertical) - { - SrcH *= pMode->VDisplay; - DstH *= pATI->LCDVertical; - } - } - else - { - if (pMode->Flags & V_DBLSCAN) - Shift--; - if (pMode->VScan > 1) - DstH *= pMode->VScan; - } - - *pVScale = ATIDivide(SrcH, DstH, Shift, 0); -} - -/* - * ATIMach64ClipVideo -- - * - * Clip the video (both source and destination) and make various other - * adjustments. - */ -static Bool -ATIMach64ClipVideo -( - ScrnInfoPtr pScreenInfo, - ATIPtr pATI, - int ImageID, - short SrcX, - short SrcY, - short SrcW, - short SrcH, - short DstX, - short DstY, - short *DstW, - short *DstH, - short Width, - short Height, - RegionPtr pClip, - BoxPtr pDstBox, - INT32 *SrcX1, - INT32 *SrcX2, - INT32 *SrcY1, - INT32 *SrcY2, - int *SrcLeft, - int *SrcTop -) -{ - CARD32 HScale, VScale; - - /* Check hardware limits */ - if ((Height <= 0) || (Height > 2048) || (Width <= 0) || (Width > 720) || - ((Width > 384) && (pATI->Chip < ATI_CHIP_264VTB))) - return FALSE; - - ATIMach64ScaleVideo(pATI, pScreenInfo->currentMode, - SrcW, SrcH, *DstW, *DstH, &HScale, &VScale); - if (!HScale || !VScale) - return FALSE; - if (HScale > MaxScale) - *DstW = (*DstW * HScale) / MaxScale; - if (VScale > MaxScale) - *DstH = (*DstH * HScale) / MaxScale; - - /* Clip both the source and the destination */ - *SrcX1 = SrcX; - *SrcX2 = SrcX + SrcW; - *SrcY1 = SrcY; - *SrcY2 = SrcY + SrcH; - - pDstBox->x1 = DstX; - pDstBox->x2 = DstX + *DstW; - pDstBox->y1 = DstY; - pDstBox->y2 = DstY + *DstH; - - if (!xf86XVClipVideoHelper(pDstBox, SrcX1, SrcX2, SrcY1, SrcY2, - pClip, Width, Height)) - return FALSE; - - /* - * Reset overlay scaler origin. This prevents jittering during - * viewport panning or while the video is being moved or gradually - * obscured/unobscured. - */ - pDstBox->x1 = DstX; - pDstBox->y1 = DstY; - - /* Translate to the current viewport */ - pDstBox->x1 -= pScreenInfo->frameX0; - pDstBox->x2 -= pScreenInfo->frameX0; - pDstBox->y1 -= pScreenInfo->frameY0; - pDstBox->y2 -= pScreenInfo->frameY0; - - *SrcLeft = *SrcTop = 0; - - /* - * If the overlay scaler origin ends up outside the current viewport, move - * it to the viewport's top left corner. This unavoidably causes a slight - * jittering in the image (even with double-buffering). - */ - if (pDstBox->x1 < 0) - { - *SrcLeft = ((-pDstBox->x1 * SrcW) / *DstW) & ~1; - pDstBox->x1 = 0; - } - - if (pDstBox->y1 < 0) - { - *SrcTop = (-pDstBox->y1 * SrcH) / *DstH; - pDstBox->y1 = 0; - - switch (ImageID) - { - case FOURCC_YV12: - case FOURCC_I420: - *SrcTop = (*SrcTop + 1) & ~1; - break; - - default: - break; - } - } - - return TRUE; -} - -#ifdef ATIMove32 - -/* A faster intercept */ -#undef xf86XVCopyPacked -#define xf86XVCopyPacked ATIMach64XVCopyPacked - -static void -ATIMach64XVCopyPacked -( - const CARD8 *pSrc, - CARD8 *pDst, - int SrcPitch, - int DstPitch, - int Height, - int Width -) -{ - Width >>= 1; - while (--Height >= 0) - { - ATIMove32(pDst, pSrc, Width); - pSrc += SrcPitch; - pDst += DstPitch; - } -} - -#endif - -/* - * ATIMach64DisplayVideo -- - * - * This function programmes Mach64 registers needed to display a video. - */ -static void -ATIMach64DisplayVideo -( - ScrnInfoPtr pScreenInfo, - ATIPtr pATI, - BoxPtr pDstBox, - int ImageID, - int Offset, - int Pitch, - short SrcW, - short SrcH, - short DstW, - short DstH, - short Width, - short Height -) -{ - DisplayModePtr pMode = pScreenInfo->currentMode; - CARD32 HScale, VScale; - - if (pMode->VScan > 1) - { - pDstBox->y1 *= pMode->VScan; - pDstBox->y2 *= pMode->VScan; - } - if (pMode->Flags & V_DBLSCAN) - { - pDstBox->y1 <<= 1; - pDstBox->y2 <<= 1; - } - - /* Recalculate overlay scale factors */ - ATIMach64ScaleVideo(pATI, pMode, SrcW, SrcH, DstW, DstH, &HScale, &VScale); - - pATI->NewHW.video_format &= ~SCALER_IN; - if (ImageID == FOURCC_UYVY) - pATI->NewHW.video_format |= SCALER_IN_YVYU422; - else - pATI->NewHW.video_format |= SCALER_IN_VYUY422; - - ATIMach64WaitForFIFO(pATI, 8); - outq(OVERLAY_Y_X_START, OVERLAY_Y_X_END, OVERLAY_LOCK_START | - SetWord(pDstBox->x1, 1) | SetWord(pDstBox->y1, 0), - SetWord(pDstBox->x2 - 1, 1) | SetWord(pDstBox->y2 - 1, 0)); - outf(OVERLAY_SCALE_INC, SetWord(HScale, 1) | SetWord(VScale, 0)); - outf(SCALER_HEIGHT_WIDTH, SetWord(Width, 1) | SetWord(Height, 0)); - outf(VIDEO_FORMAT, pATI->NewHW.video_format); - - if (pATI->Chip < ATI_CHIP_264VTB) - { - outf(BUF0_OFFSET, Offset); - outf(BUF0_PITCH, Pitch); - } - else - { - outf(SCALER_BUF0_OFFSET, Offset); - outf(SCALER_BUF_PITCH, Pitch); - } - - outf(OVERLAY_SCALE_CNTL, SCALE_PIX_EXPAND | OVERLAY_EN | SCALE_EN); -} - -/* - * ATIMach64PutImage -- - * - * This function is called to put a video image on the screen. - */ -static int -ATIMach64PutImage -( - ScrnInfoPtr pScreenInfo, - short SrcX, - short SrcY, - short DstX, - short DstY, - short SrcW, - short SrcH, - short DstW, - short DstH, - int ImageID, - unsigned char *Buffer, - short Width, - short Height, - Bool Synchronise, - RegionPtr pClip, - pointer Data -) -{ - ATIPtr pATI = Data; - ScreenPtr pScreen; - INT32 SrcX1, SrcX2, SrcY1, SrcY2; - BoxRec DstBox; - int SrcPitch, SrcPitchUV, DstPitch, DstSize; - int SrcTop, SrcLeft, DstWidth, DstHeight; - int Top, Bottom, Left, Right, nLine, nPixel, Offset; - int OffsetV, OffsetU; - int tmp; - CARD8 *pDst; - - if (pATI->ActiveSurface) - return Success; - - if (!ATIMach64ClipVideo(pScreenInfo, pATI, ImageID, - SrcX, SrcY, SrcW, SrcH, - DstX, DstY, &DstW, &DstH, - Width, Height, pClip, &DstBox, - &SrcX1, &SrcX2, &SrcY1, &SrcY2, - &SrcLeft, &SrcTop)) - return Success; - - pScreen = pScreenInfo->pScreen; - - DstWidth = Width - SrcLeft; - DstHeight = Height - SrcTop; - - /* - * Allocate an offscreen buffer for the entire source, even though only a - * subset of the source will be copied into it. - */ - DstPitch = /* bytes */ - (DstWidth + DstWidth + 15) & ~15; - DstSize = /* pixels */ - ((DstPitch * DstHeight) + pATI->AdjustDepth - 1) / pATI->AdjustDepth; - - pATI->pXVBuffer = ATIResizeOffscreenLinear(pScreen, pATI->pXVBuffer, - (pATI->DoubleBuffer + 1) * DstSize); - - if (!pATI->pXVBuffer) - { - if (!pATI->DoubleBuffer) - return BadAlloc; - - pATI->pXVBuffer = - ATIResizeOffscreenLinear(pScreen, pATI->pXVBuffer, DstSize); - - if (!pATI->pXVBuffer) - return BadAlloc; - - xf86DrvMsg(pScreenInfo->scrnIndex, X_WARNING, - "Video image double-buffering downgraded to single-buffering\n due" - " to insufficient video memory.\n"); - pATI->DoubleBuffer = pATI->CurrentBuffer = 0; - } - else - { - /* Possibly switch buffers */ - pATI->CurrentBuffer = pATI->DoubleBuffer - pATI->CurrentBuffer; - } - - /* Synchronise video memory accesses */ - ATIMach64Sync(pScreenInfo); - - Offset = (pATI->pXVBuffer->offset * pATI->AdjustDepth) + - (pATI->CurrentBuffer * DstSize * pATI->AdjustDepth); - pDst = pATI->pMemoryLE; - pDst += Offset; - - switch (ImageID) - { - case FOURCC_YV12: - case FOURCC_I420: - Left = (SrcX1 >> 16) & ~1; - Right = ((SrcX2 + 0x1FFFF) >> 16) & ~1; - Top = (SrcY1 >> 16) & ~1; - Bottom = ((SrcY2 + 0x1FFFF) >> 16) & ~1; - - if ((Right < Width) && ((SrcX1 & 0x1FFFF) <= (SrcX2 & 0x1FFFF))) - Right += 2; - if ((Bottom < Height) && ((SrcY1 & 0x1FFFF) <= (SrcY2 & 0x1FFFF))) - Bottom += 2; - - nPixel = Right - Left; - nLine = Bottom - Top; - - SrcPitch = (Width + 3) & ~3; - OffsetV = SrcPitch * Height; - SrcPitchUV = ((Width >> 1) + 3) & ~3; - OffsetU = ((Height >> 1) * SrcPitchUV) + OffsetV; - - tmp = ((Top >> 1) * SrcPitchUV) + (Left >> 1); - OffsetV += tmp; - OffsetU += tmp; - - if (ImageID == FOURCC_I420) - { - tmp = OffsetV; - OffsetV = OffsetU; - OffsetU = tmp; - } - - pDst += ((Top - SrcTop) * DstPitch) + ((Left - SrcLeft) << 1); - - xf86XVCopyYUV12ToPacked(Buffer + (Top * SrcPitch) + Left, - Buffer + OffsetV, Buffer + OffsetU, pDst, SrcPitch, SrcPitchUV, - DstPitch, nLine, nPixel); - break; - - case FOURCC_UYVY: - case FOURCC_YUY2: - default: - Left = (SrcX1 >> 16) & ~1; - Right = ((SrcX2 + 0x1FFFF) >> 16) & ~1; - Top = SrcY1 >> 16; - Bottom = (SrcY2 + 0x0FFFF) >> 16; - - if ((Right < Width) && ((SrcX1 & 0x1FFFF) <= (SrcX2 & 0x1FFFF))) - Right += 2; - if ((Bottom < Height) && ((SrcY1 & 0x0FFFF) <= (SrcY2 & 0x0FFFF))) - Bottom++; - - nPixel = Right - Left; - nLine = Bottom - Top; - - SrcPitch = Width << 1; - Buffer += (Top * SrcPitch) + (Left << 1); - pDst += ((Top - SrcTop) * DstPitch) + ((Left - SrcLeft) << 1); - - xf86XVCopyPacked(Buffer, pDst, SrcPitch, DstPitch, nLine, nPixel); - break; - } - - if (!REGION_EQUAL(pScreen, &pATI->VideoClip, pClip)) - { - REGION_COPY(pScreen, &pATI->VideoClip, pClip); - if (pATI->AutoPaint) - xf86XVFillKeyHelper(pScreen, pATI->NewHW.overlay_graphics_key_clr, - pClip); - } - - ATIMach64DisplayVideo(pScreenInfo, pATI, &DstBox, ImageID, - Offset, DstPitch / 2, SrcW, SrcH, DstW, DstH, DstWidth, DstHeight); - - return Success; -} - -/* - * ATIMach64AllocateSurface -- - * - * This function allocates an offscreen buffer (called a "surface") for use by - * an external driver such as 'v4l'. - */ -static int -ATIMach64AllocateSurface -( - ScrnInfoPtr pScreenInfo, - int ImageID, - unsigned short Width, - unsigned short Height, - XF86SurfacePtr pSurface -) -{ - ScreenPtr pScreen; - ATIPtr pATI = ATIPTR(pScreenInfo); - - if (pATI->ActiveSurface) - return BadAlloc; - - if ((Height <= 0) || (Height > 2048) || (Width <= 0) || (Width > 720) || - ((Width > 384) && (pATI->Chip < ATI_CHIP_264VTB))) - return BadValue; - - Width = (Width + 1) & ~1; - pATI->SurfacePitch = ((Width << 1) + 15) & ~15; - - pScreen = pScreenInfo->pScreen; - - pATI->pXVBuffer = ATIResizeOffscreenLinear(pScreen, pATI->pXVBuffer, - ((Height * pATI->SurfacePitch) + pATI->AdjustDepth - 1) / - pATI->AdjustDepth); - if (!pATI->pXVBuffer) - return BadAlloc; - - pATI->SurfaceOffset = pATI->pXVBuffer->offset * pATI->AdjustDepth; - - pSurface->pScrn = pScreenInfo; - pSurface->id = ImageID; - pSurface->width = Width; - pSurface->height = Height; - pSurface->pitches = &pATI->SurfacePitch; - pSurface->offsets = &pATI->SurfaceOffset; - pSurface->devPrivate.ptr = pATI; - - /* Stop the video */ - outf(OVERLAY_SCALE_CNTL, SCALE_EN); - REGION_EMPTY(pScreen, &pATI->VideoClip); - pATI->ActiveSurface = TRUE; - - return Success; -} - -/* - * ATIMach64FreeSurface -- - * - * This function called to free a surface's offscreen buffer. - */ -static int -ATIMach64FreeSurface -( - XF86SurfacePtr pSurface -) -{ - ATIPtr pATI = pSurface->devPrivate.ptr; - - if (!pATI->ActiveSurface) - return Success; - - outf(OVERLAY_SCALE_CNTL, SCALE_EN); - pATI->pXVBuffer = ATIResizeOffscreenLinear(pSurface->pScrn->pScreen, - pATI->pXVBuffer, 0); - pATI->ActiveSurface = FALSE; - - return Success; -} - -/* - * ATIMach64DisplaySurface -- - * - * This function is called to display a video surface. - */ -static int -ATIMach64DisplaySurface -( - XF86SurfacePtr pSurface, - short SrcX, - short SrcY, - short DstX, - short DstY, - short SrcW, - short SrcH, - short DstW, - short DstH, - RegionPtr pClip -) -{ - ATIPtr pATI = pSurface->devPrivate.ptr; - ScrnInfoPtr pScreenInfo; - int ImageID; - short Width, Height; - BoxRec DstBox; - INT32 SrcX1, SrcX2, SrcY1, SrcY2; - int SrcLeft, SrcTop, SrcPitch, Offset; - - if (!pATI->ActiveSurface) - return Success; - - pScreenInfo = pSurface->pScrn; - ImageID = pSurface->id; - Width = pSurface->width; - Height = pSurface->height; - - if (!ATIMach64ClipVideo(pScreenInfo, pATI, ImageID, - SrcX, SrcY, SrcW, SrcH, - DstX, DstY, &DstW, &DstH, - Width, Height, pClip, &DstBox, - &SrcX1, &SrcX2, &SrcY1, &SrcY2, - &SrcLeft, &SrcTop)) - return Success; - - xf86XVFillKeyHelper(pScreenInfo->pScreen, - pATI->NewHW.overlay_graphics_key_clr, pClip); - - SrcPitch = pSurface->pitches[0]; - Offset = pSurface->offsets[0] + (SrcTop * SrcPitch) + (SrcLeft << 1); - ATIMach64DisplayVideo(pScreenInfo, pATI, &DstBox, ImageID, - Offset, SrcPitch, SrcW, SrcH, DstW, DstH, Width, Height); - - return Success; -} - -/* - * ATIMach64StopSurface -- - * - * This function is called to stop the overlaid display of a video surface. - */ -static int -ATIMach64StopSurface -( - XF86SurfacePtr pSurface -) -{ - ATIPtr pATI = pSurface->devPrivate.ptr; - - if (pATI->ActiveSurface) - outf(OVERLAY_SCALE_CNTL, SCALE_EN); - - return Success; -} - -/* - * ATIMach64GetSurfaceAttribute -- - * - * Retrieve the value of an XVideo attribute. - */ -static int -ATIMach64GetSurfaceAttribute -( - ScrnInfoPtr pScreenInfo, - Atom AttributeID, - INT32 *Value -) -{ - return ATIMach64GetPortAttribute(pScreenInfo, AttributeID, Value, - ATIPTR(pScreenInfo)); -} - -/* - * ATIMach64SetSurfaceAttribute - * - * Set the value of an XVideo attribute. - */ -static int -ATIMach64SetSurfaceAttribute -( - ScrnInfoPtr pScreenInfo, - Atom AttributeID, - INT32 Value -) -{ - return ATIMach64SetPortAttribute(pScreenInfo, AttributeID, Value, - ATIPTR(pScreenInfo)); -} - -/* XVideo surface registration data */ -static XF86OffscreenImageRec ATIMach64Surface_A[] = -{ - { - &ATIMach64Image[0], /* YUY2 */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 384, 2048, - nATIMach64Attribute - 5, /* No double-buffering */ - ATIMach64Attribute + 4 /* No saturation nor brightness */ - }, - { - &ATIMach64Image[1], /* UYVY */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 384, 2048, - nATIMach64Attribute - 5, /* No double-buffering */ - ATIMach64Attribute + 4 /* No saturation nor brightness */ - } -}; -#define nATIMach64Surface_A NumberOf(ATIMach64Surface_A) - -static XF86OffscreenImageRec ATIMach64Surface_B[] = -{ - { - &ATIMach64Image[0], /* YUY2 */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 720, 2048, - nATIMach64Attribute - 5, /* No double-buffering */ - ATIMach64Attribute + 4 /* No saturation nor brightness */ - }, - { - &ATIMach64Image[1], /* UYVY */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 720, 2048, - nATIMach64Attribute - 5, /* No double-buffering */ - ATIMach64Attribute + 4 /* No saturation nor brightness */ - } -}; -#define nATIMach64Surface_B NumberOf(ATIMach64Surface_B) - -static XF86OffscreenImageRec ATIMach64Surface_C[] = -{ - { - &ATIMach64Image[0], /* YUY2 */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 720, 2048, - nATIMach64Attribute - 1, /* No double-buffering */ - ATIMach64Attribute - }, - { - &ATIMach64Image[1], /* UYVY */ - VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT, - ATIMach64AllocateSurface, - ATIMach64FreeSurface, - ATIMach64DisplaySurface, - ATIMach64StopSurface, - ATIMach64GetSurfaceAttribute, - ATIMach64SetSurfaceAttribute, - 720, 2048, - nATIMach64Attribute - 1, /* No double-buffering */ - ATIMach64Attribute - } -}; -#define nATIMach64Surface_C NumberOf(ATIMach64Surface_C) - -/* - * ATIMach64XVInitialiseAdaptor -- - * - * This function is called to make a Mach64's hardware overlay support - * available as an XVideo adaptor. - */ -int -ATIMach64XVInitialiseAdaptor -( - ScreenPtr pScreen, - ScrnInfoPtr pScreenInfo, - ATIPtr pATI, - XF86VideoAdaptorPtr **pppAdaptor -) -{ - XF86VideoAdaptorPtr pAdaptor; - int Index; - - if (!pATI->Block1Base) - return 0; - - if (!(pAdaptor = xf86XVAllocateVideoAdaptorRec(pScreenInfo))) - return 0; - - *pppAdaptor = xnfalloc(sizeof(pAdaptor)); - **pppAdaptor = pAdaptor; - - pAdaptor->nPorts = 1; - pAdaptor->pPortPrivates = pATI->XVPortPrivate; - pATI->XVPortPrivate[0].ptr = pATI; - - pAdaptor->type = XvInputMask | XvImageMask | XvWindowMask; - pAdaptor->flags = VIDEO_OVERLAID_IMAGES | VIDEO_CLIP_TO_VIEWPORT; - pAdaptor->name = "ATI Mach64 Back-end Overlay Scaler"; - - if (pATI->Chip < ATI_CHIP_264VTB) - { - pAdaptor->nEncodings = nATIMach64VideoEncoding_A; - pAdaptor->pEncodings = ATIMach64VideoEncoding_A; - } - else - { - pAdaptor->nEncodings = nATIMach64VideoEncoding_B; - pAdaptor->pEncodings = ATIMach64VideoEncoding_B; - } - - pAdaptor->nFormats = nATIMach64VideoFormat; - pAdaptor->pFormats = ATIMach64VideoFormat; - - pAdaptor->nAttributes = nATIMach64Attribute; - pAdaptor->pAttributes = ATIMach64Attribute; - - if (pATI->Chip < ATI_CHIP_264GTPRO) - { - /* Older controllers don't have brightness or saturation controls */ - pAdaptor->nAttributes -= 4; - pAdaptor->pAttributes += 4; - } - - pAdaptor->nImages = nATIMach64Image; - pAdaptor->pImages = ATIMach64Image; - - pAdaptor->StopVideo = ATIMach64StopVideo; - pAdaptor->SetPortAttribute = ATIMach64SetPortAttribute; - pAdaptor->GetPortAttribute = ATIMach64GetPortAttribute; - pAdaptor->QueryBestSize = ATIMach64QueryBestSize; - pAdaptor->PutImage = ATIMach64PutImage; - pAdaptor->QueryImageAttributes = ATIMach64QueryImageAttributes; - - REGION_INIT(pScreen, &pATI->VideoClip, NullBox, 0); - pATI->ActiveSurface = FALSE; - - if (ATIMach64XVAtomGeneration != serverGeneration) - { - /* Refresh static data */ - ATIMach64XVAtomGeneration = serverGeneration; - - Index = nATIMach64Attribute - pAdaptor->nAttributes; - for (; Index < nATIMach64Attribute; Index++) - ATIMach64AttributeInfo[Index].AttributeID = - MAKE_ATOM(ATIMach64Attribute[Index].name); - } - - ATIMach64SetDefaultAttributes(pATI, 0); - - if (pATI->Chip < ATI_CHIP_264VTB) - { - xf86XVRegisterOffscreenImages(pScreen, - ATIMach64Surface_A, nATIMach64Surface_A); - } - else if (pATI->Chip < ATI_CHIP_264GTPRO) - { - xf86XVRegisterOffscreenImages(pScreen, - ATIMach64Surface_B, nATIMach64Surface_B); - } - else - { - xf86XVRegisterOffscreenImages(pScreen, - ATIMach64Surface_C, nATIMach64Surface_C); - } - - return 1; -} - -/* - * ATIMach64CloseXVideo -- - * - * This function is called during screen termination to clean up after - * initialisation of Mach64 XVideo support. - */ -void -ATIMach64CloseXVideo -( - ScreenPtr pScreen, - ScrnInfoPtr pScreenInfo, - ATIPtr pATI -) -{ - ATIMach64StopVideo(pScreenInfo, pATI, TRUE); - - REGION_UNINIT(pScreen, &pATI->VideoClip); -} |