Finish Xv support for kdrive/mach64

This commit is contained in:
Keith Packard 2001-06-19 09:31:47 +00:00
parent 6d86517b0e
commit 918ff10f26
4 changed files with 222 additions and 168 deletions

View File

@ -19,7 +19,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.2 2001/06/04 09:45:41 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.c,v 1.3 2001/06/16 05:48:48 keithp Exp $ */
#include "mach64.h" #include "mach64.h"
#include <sys/io.h> #include <sys/io.h>
@ -78,6 +78,21 @@ mach64ScreenInit (KdScreenInfo *screen)
if (mach64s->vesa.mapping != VESA_LINEAR) if (mach64s->vesa.mapping != VESA_LINEAR)
screen->dumb = TRUE; screen->dumb = TRUE;
mach64s->screen = mach64s->vesa.fb; mach64s->screen = mach64s->vesa.fb;
switch (screen->fb[0].depth) {
case 8:
mach64s->colorKey = 0xff;
break;
case 15:
case 16:
mach64s->colorKey = 0x001e;
break;
case 24:
mach64s->colorKey = 0x0000fe;
break;
default:
mach64s->colorKey = 1;
break;
}
mach64s->colorKey = 1; mach64s->colorKey = 1;
memory = mach64s->vesa.fb_size; memory = mach64s->vesa.fb_size;
screen_size = screen->fb[0].byteStride * screen->height; screen_size = screen->fb[0].byteStride * screen->height;
@ -108,7 +123,10 @@ Bool
mach64InitScreen (ScreenPtr pScreen) mach64InitScreen (ScreenPtr pScreen)
{ {
#ifdef XV #ifdef XV
mach64InitVideo(pScreen); KdScreenPriv(pScreen);
Mach64CardInfo *mach64c = pScreenPriv->screen->card->driver;
if (mach64c->media_reg && mach64c->reg)
mach64InitVideo(pScreen);
#endif #endif
return vesaInitScreen (pScreen); return vesaInitScreen (pScreen);
} }

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.h,v 1.2 2001/06/04 09:45:42 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64.h,v 1.3 2001/06/16 05:48:48 keithp Exp $ */
#ifndef _MACH64_H_ #ifndef _MACH64_H_
#define _MACH64_H_ #define _MACH64_H_
@ -349,6 +349,8 @@ typedef struct _Reg {
#define SCALE_OVERLAY_EN (1 << 30) #define SCALE_OVERLAY_EN (1 << 30)
#define SCALE_EN (1 << 31) #define SCALE_EN (1 << 31)
#define VIDEO_IN_VYUY422 (0xb)
#define VIDEO_IN_YVYU422 (0xc)
#define SCALER_IN_15bpp (0x3 << 16) #define SCALER_IN_15bpp (0x3 << 16)
#define SCALER_IN_16bpp (0x4 << 16) #define SCALER_IN_16bpp (0x4 << 16)
#define SCALER_IN_32bpp (0x6 << 16) #define SCALER_IN_32bpp (0x6 << 16)
@ -428,14 +430,15 @@ typedef struct _MediaReg {
VOL32 TVO_CNTL; /* 0x140 */ VOL32 TVO_CNTL; /* 0x140 */
VOL32 unused_141[15]; VOL32 unused_141[15];
VOL32 unused_150; /* 0x150 */ VOL32 unused_150; /* 0x150 */
VOL32 CRT_HORZ_VERT_LOAD; VOL32 CRT_HORZ_VERT_LOAD; /* 0x151 */
VOL32 AGP_BASE_AGP_CNTL; VOL32 AGP_BASE; /* 0x152 */
VOL32 SCALER_COLOUR_CNTL; VOL32 AGP_CNTL; /* 0x153 */
VOL32 SCALER_H_COEFF0; VOL32 SCALER_COLOUR_CNTL; /* 0x154 */
VOL32 SCALER_H_COEFF1; VOL32 SCALER_H_COEFF0; /* 0x155 */
VOL32 SCALER_H_COEFF2; VOL32 SCALER_H_COEFF1; /* 0x156 */
VOL32 SCALER_H_COEFF3; VOL32 SCALER_H_COEFF2; /* 0x157 */
VOL32 SCALER_H_COEFF4; VOL32 SCALER_H_COEFF3; /* 0x158 */
VOL32 SCALER_H_COEFF4; /* 0x159 */
VOL32 unused_15a; VOL32 unused_15a;
VOL32 unused_15b; VOL32 unused_15b;
VOL32 GUI_CMDFIFO_DEBUG; VOL32 GUI_CMDFIFO_DEBUG;
@ -504,8 +507,8 @@ typedef struct _mach64PortPriv {
CARD8 currentBuf; CARD8 currentBuf;
CARD8 brightness; int brightness;
CARD8 contrast; int saturation;
RegionRec clip; RegionRec clip;
CARD32 colorKey; CARD32 colorKey;
@ -543,6 +546,12 @@ mach64ReadLCD (Reg *reg, int id);
void void
mach64WriteLCD (Reg *reg, int id, CARD32 data); mach64WriteLCD (Reg *reg, int id, CARD32 data);
void
mach64WaitAvail(Reg *reg, int n);
void
mach64WaitIdle (Reg *reg);
Bool Bool
mach64DrawSetup (ScreenPtr pScreen); mach64DrawSetup (ScreenPtr pScreen);

View File

@ -21,7 +21,7 @@
* TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR * TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR
* PERFORMANCE OF THIS SOFTWARE. * PERFORMANCE OF THIS SOFTWARE.
*/ */
/* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64draw.c,v 1.2 2001/06/04 09:45:42 keithp Exp $ */ /* $XFree86: xc/programs/Xserver/hw/kdrive/mach64/mach64draw.c,v 1.3 2001/06/16 05:48:49 keithp Exp $ */
#include "mach64.h" #include "mach64.h"
#include "mach64draw.h" #include "mach64draw.h"
@ -69,8 +69,8 @@ static CARD32 combo;
#define IDX(reg,n) (&(reg)->n - &(reg)->CRTC_H_TOTAL_DISP) #define IDX(reg,n) (&(reg)->n - &(reg)->CRTC_H_TOTAL_DISP)
static void void
WAIT_AVAIL(Reg *reg, int n) mach64WaitAvail(Reg *reg, int n)
{ {
if (avail < n) if (avail < n)
{ {
@ -80,8 +80,8 @@ WAIT_AVAIL(Reg *reg, int n)
avail -= n; avail -= n;
} }
static void void
WAIT_IDLE (Reg *reg) mach64WaitIdle (Reg *reg)
{ {
while (reg->GUI_STAT & 1) while (reg->GUI_STAT & 1)
; ;
@ -98,7 +98,7 @@ mach64Setup (ScreenPtr pScreen, CARD32 combo, int wait)
triple = mach64s->bpp24; triple = mach64s->bpp24;
avail = 0; avail = 0;
WAIT_AVAIL(reg, wait + 3); mach64WaitAvail(reg, wait + 3);
reg->DP_PIX_WIDTH = mach64s->DP_PIX_WIDTH; reg->DP_PIX_WIDTH = mach64s->DP_PIX_WIDTH;
reg->USR1_DST_OFF_PITCH = mach64s->USR1_DST_OFF_PITCH; reg->USR1_DST_OFF_PITCH = mach64s->USR1_DST_OFF_PITCH;
reg->DP_SET_GUI_ENGINE = mach64s->DP_SET_GUI_ENGINE | (combo << 20); reg->DP_SET_GUI_ENGINE = mach64s->DP_SET_GUI_ENGINE | (combo << 20);
@ -133,10 +133,10 @@ mach64Solid (int x1, int y1, int x2, int y2)
DST_Y_DIR | DST_Y_DIR |
DST_24_ROT_EN | DST_24_ROT_EN |
DST_24_ROT((x1 / 4) % 6)); DST_24_ROT((x1 / 4) % 6));
WAIT_AVAIL (reg, 1); mach64WaitAvail (reg, 1);
reg->GUI_TRAJ_CNTL = traj; reg->GUI_TRAJ_CNTL = traj;
} }
WAIT_AVAIL(reg,2); mach64WaitAvail(reg,2);
reg->DST_X_Y = MACH64_XY(x1,y1); reg->DST_X_Y = MACH64_XY(x1,y1);
reg->DST_WIDTH_HEIGHT = MACH64_XY(x2-x1,y2-y1); reg->DST_WIDTH_HEIGHT = MACH64_XY(x2-x1,y2-y1);
} }
@ -194,7 +194,7 @@ mach64Copy (int srcX,
if (copyDy > 0) if (copyDy > 0)
traj |= 2; traj |= 2;
WAIT_AVAIL (reg, 1); mach64WaitAvail (reg, 1);
reg->GUI_TRAJ_CNTL = traj; reg->GUI_TRAJ_CNTL = traj;
} }
if (copyDx <= 0) if (copyDx <= 0)
@ -207,7 +207,7 @@ mach64Copy (int srcX,
srcY += h - 1; srcY += h - 1;
dstY += h - 1; dstY += h - 1;
} }
WAIT_AVAIL (reg, 4); mach64WaitAvail (reg, 4);
reg->SRC_Y_X = MACH64_YX(srcX, srcY); reg->SRC_Y_X = MACH64_YX(srcX, srcY);
reg->SRC_WIDTH1 = w; reg->SRC_WIDTH1 = w;
reg->DST_Y_X = MACH64_YX(dstX, dstY); reg->DST_Y_X = MACH64_YX(dstX, dstY);
@ -414,5 +414,5 @@ mach64DrawSync (ScreenPtr pScreen)
mach64CardInfo(pScreenPriv); mach64CardInfo(pScreenPriv);
reg = mach64c->reg; reg = mach64c->reg;
WAIT_IDLE (reg); mach64WaitIdle (reg);
} }

View File

@ -26,7 +26,7 @@
#define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE) #define MAKE_ATOM(a) MakeAtom(a, sizeof(a) - 1, TRUE)
static Atom xvBrightness, xvContrast, xvColorKey; static Atom xvBrightness, xvSaturation, xvColorKey;
#define IMAGE_MAX_WIDTH 720 #define IMAGE_MAX_WIDTH 720
#define IMAGE_MAX_HEIGHT 576 #define IMAGE_MAX_HEIGHT 576
@ -41,12 +41,19 @@ mach64StopVideo(KdScreenInfo *screen, pointer data, Bool exit)
Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver; Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver;
Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver; Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver;
Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr; Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr;
Reg *reg = mach64c->reg;
MediaReg *media = mach64c->media_reg; MediaReg *media = mach64c->media_reg;
REGION_EMPTY(screen->pScreen, &pPortPriv->clip); REGION_EMPTY(screen->pScreen, &pPortPriv->clip);
if(pPortPriv->videoOn) if(pPortPriv->videoOn)
{ {
mach64WaitIdle (reg);
media->OVERLAY_Y_X_START = 0x80000000;
media->OVERLAY_Y_X_END = 0;
media->OVERLAY_SCALE_CNTL = 0;
media->OVERLAY_Y_X_START = 0;
pPortPriv->videoOn = FALSE; pPortPriv->videoOn = FALSE;
} }
} }
@ -67,15 +74,19 @@ mach64SetPortAttribute(KdScreenInfo *screen,
if(attribute == xvBrightness) if(attribute == xvBrightness)
{ {
if((value < -128) || (value > 127)) if(value < -1000)
return BadValue; value = -1000;
if (value > 1000)
value = 1000;
pPortPriv->brightness = value; pPortPriv->brightness = value;
} }
else if(attribute == xvContrast) else if(attribute == xvSaturation)
{ {
if((value < 0) || (value > 255)) if (value < -1000)
return BadValue; value = -1000;
pPortPriv->contrast = value; if (value > 1000)
value = 1000;
pPortPriv->saturation = value;
} }
else if(attribute == xvColorKey) else if(attribute == xvColorKey)
{ {
@ -98,8 +109,8 @@ mach64GetPortAttribute(KdScreenInfo *screen,
if(attribute == xvBrightness) if(attribute == xvBrightness)
*value = pPortPriv->brightness; *value = pPortPriv->brightness;
else if(attribute == xvContrast) else if(attribute == xvSaturation)
*value = pPortPriv->contrast; *value = pPortPriv->saturation;
else if(attribute == xvColorKey) else if(attribute == xvColorKey)
*value = pPortPriv->colorKey; *value = pPortPriv->colorKey;
else else
@ -162,6 +173,7 @@ static void
mach64CopyPlanarData(KdScreenInfo *screen, mach64CopyPlanarData(KdScreenInfo *screen,
unsigned char *buf, unsigned char *buf,
int srcPitch, int srcPitch,
int srcPitch2,
int dstPitch, /* of chroma */ int dstPitch, /* of chroma */
int srcH, int srcH,
int top, int top,
@ -176,68 +188,101 @@ mach64CopyPlanarData(KdScreenInfo *screen,
Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver; Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver;
Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver; Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver;
Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr; Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr;
int i; int i, j;
CARD8 *src1, *src2, *src3, *dst1, *dst2, *dst3; CARD8 *src1, *src2, *src3, *dst1;
/* compute source data pointers */
src1 = buf;
src2 = src1 + srcH * srcPitch;
src3 = src2 + (srcH >> 1) * srcPitch2;
/* adjust for origin */
src1 += top * srcPitch + left;
src2 += (top >> 1) * srcPitch2 + (left >> 1);
src3 += (top >> 1) * srcPitch2 + (left >> 1);
if (id == FOURCC_I420)
{
CARD8 *srct = src2;
src2 = src3;
src3 = srct;
}
/* Copy Y data */
src1 = buf + (top*srcPitch) + left;
if (pPortPriv->currentBuf == 0) if (pPortPriv->currentBuf == 0)
dst1 = (CARD8 *) mach64s->vesa.fb + pPortPriv->YBuf0Offset; dst1 = (CARD8 *) mach64s->vesa.fb + pPortPriv->YBuf0Offset;
else else
dst1 = (CARD8 *) mach64s->vesa.fb + pPortPriv->YBuf1Offset; dst1 = (CARD8 *) mach64s->vesa.fb + pPortPriv->YBuf1Offset;
for (i = 0; i < h; i++) w >>= 1;
for (j = 0; j < h; j++)
{ {
memcpy(dst1, src1, w); CARD32 *dst = (CARD32 *) dst1;
CARD8 *s1 = src1;
CARD8 *s2 = src2;
CARD8 *s3 = src3;
for (i = 0; i < w; i++)
{
*dst++ = s1[0] | (s1[1] << 16) | (s3[0] << 8) | (s2[0] << 24);
s1 += 2;
s2++;
s3++;
}
src1 += srcPitch; src1 += srcPitch;
dst1 += dstPitch << 1; dst1 += dstPitch;
if (j & 1)
{
src2 += srcPitch2;
src3 += srcPitch2;
}
}
}
/* I really should stick this in miregion */
static Bool
RegionsEqual(RegionPtr A, RegionPtr B)
{
int *dataA, *dataB;
int num;
num = REGION_NUM_RECTS(A);
if(num != REGION_NUM_RECTS(B))
return FALSE;
if((A->extents.x1 != B->extents.x1) ||
(A->extents.x2 != B->extents.x2) ||
(A->extents.y1 != B->extents.y1) ||
(A->extents.y2 != B->extents.y2))
return FALSE;
dataA = (int*)REGION_RECTS(A);
dataB = (int*)REGION_RECTS(B);
while(num--) {
if((dataA[0] != dataB[0]) || (dataA[1] != dataB[1]))
return FALSE;
dataA += 2;
dataB += 2;
} }
/* Copy V data for YV12, or U data for I420 */ return TRUE;
src2 = buf + (srcH*srcPitch) + ((top*srcPitch)>>2) + (left>>1); }
if (pPortPriv->currentBuf == 0)
{
if (id == FOURCC_I420)
dst2 = (CARD8 *) mach64s->vesa.fb + pPortPriv->UBuf0Offset;
else
dst2 = (CARD8 *) mach64s->vesa.fb + pPortPriv->VBuf0Offset;
} else {
if (id == FOURCC_I420)
dst2 = (CARD8 *) mach64s->vesa.fb + pPortPriv->UBuf1Offset;
else
dst2 = (CARD8 *) mach64s->vesa.fb + pPortPriv->VBuf1Offset;
}
for (i = 0; i < h/2; i++) static void
{ mach64PaintRegion (ScreenPtr pScreen, RegionPtr pRgn, Pixel fg)
memcpy(dst2, src2, w/2); {
src2 += srcPitch>>1; WindowPtr pRoot = WindowTable[pScreen->myNum];
dst2 += dstPitch; unsigned backgroundState;
} PixUnion background;
/* Copy U data for YV12, or V data for I420 */ /* XXX use window background painting routine XXX */
src3 = buf + (srcH*srcPitch) + ((srcH*srcPitch)>>2) + ((top*srcPitch)>>2) + (left>>1); backgroundState = pRoot->backgroundState;
if (pPortPriv->currentBuf == 0) background = pRoot->background;
{ pRoot->backgroundState = BackgroundPixel;
if (id == FOURCC_I420) pRoot->background.pixel = fg;
dst3 = (CARD8 *) mach64s->vesa.fb + pPortPriv->VBuf0Offset; (*pScreen->PaintWindowBackground) (pRoot, pRgn, PW_BACKGROUND);
else pRoot->backgroundState = backgroundState;
dst3 = (CARD8 *) mach64s->vesa.fb + pPortPriv->UBuf0Offset; pRoot->background = background;
}
else
{
if (id == FOURCC_I420)
dst3 = (CARD8 *) mach64s->vesa.fb + pPortPriv->VBuf1Offset;
else
dst3 = (CARD8 *) mach64s->vesa.fb + pPortPriv->UBuf1Offset;
}
for (i = 0; i < h/2; i++)
{
memcpy(dst3, src3, w/2);
src3 += srcPitch>>1;
dst3 += dstPitch;
}
} }
/* Mach64ClipVideo - /* Mach64ClipVideo -
@ -335,25 +380,38 @@ mach64DisplayVideo(KdScreenInfo *screen,
Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver; Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver;
Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver; Mach64CardInfo *mach64c = (Mach64CardInfo *) card->driver;
Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr; Mach64PortPrivPtr pPortPriv = mach64s->pAdaptor->pPortPrivates[0].ptr;
Reg *reg = mach64c->reg;
MediaReg *media = mach64c->media_reg; MediaReg *media = mach64c->media_reg;
int xscaleInt, xscaleFract, yscaleInt, yscaleFract; int xscaleInt, xscaleFract, yscaleInt, yscaleFract;
int xscaleIntUV = 0, xscaleFractUV = 0; int xscaleIntUV = 0, xscaleFractUV = 0;
int yscaleIntUV = 0, yscaleFractUV = 0; int yscaleIntUV = 0, yscaleFractUV = 0;
int HORZ_INC, VERT_INC; int HORZ_INC, VERT_INC;
unsigned int swidth;
CARD32 SCALER_IN; CARD32 SCALER_IN;
int tmp;
int left;
int bright;
int sat;
mach64WaitIdle (reg);
/* lock registers to prevent non-atomic update */ /* lock registers to prevent non-atomic update */
media->OVERLAY_Y_X_START = 0x80000000; media->OVERLAY_Y_X_START = 0x80000000;
/* ending screen coordinate */ /* ending screen coordinate */
media->OVERLAY_Y_X_END = MACH64_YX (x2, y2); media->OVERLAY_Y_X_END = MACH64_YX (dstBox->x2, dstBox->y2);
/* color key */ /* color key */
media->OVERLAY_GRAPHICS_KEY_CLR = mach64s->colorKey; media->OVERLAY_GRAPHICS_KEY_CLR = mach64s->colorKey;
media->OVERLAY_GRAPHICS_KEY_MSK = (1 << screen->fb[0].depth) - 1; media->OVERLAY_GRAPHICS_KEY_MSK = (1 << screen->fb[0].depth) - 1;
/* XXX always display video for now */ /* set key control to obey only graphics color key */
media->OVERLAY_KEY_CNTL = 1; media->OVERLAY_KEY_CNTL = 0x50;
/* no exclusive video region */ /* no exclusive video region */
media->OVERLAY_EXCLUSIVE_HORZ = 0; media->OVERLAY_EXCLUSIVE_HORZ = 0;
media->OVERLAY_EXCLUSIVE_VERT = 0;
/* scaling coefficients */
media->SCALER_H_COEFF0 = 0x00002000;
media->SCALER_H_COEFF1 = 0x0D06200D;
media->SCALER_H_COEFF2 = 0x0D0A1C0D;
media->SCALER_H_COEFF3 = 0x0C0E1A0C;
media->SCALER_H_COEFF4 = 0x0C14140C;
VERT_INC = (src_h << 12) / drw_h; VERT_INC = (src_h << 12) / drw_h;
HORZ_INC = (src_w << 12) / drw_w; HORZ_INC = (src_w << 12) / drw_w;
@ -361,76 +419,51 @@ mach64DisplayVideo(KdScreenInfo *screen,
media->OVERLAY_SCALE_INC = MACH64_YX(HORZ_INC, VERT_INC); media->OVERLAY_SCALE_INC = MACH64_YX(HORZ_INC, VERT_INC);
media->OVERLAY_SCALE_CNTL = (SCALE_PIX_EXPAND | media->OVERLAY_SCALE_CNTL = (SCALE_PIX_EXPAND |
SCALE_GAMMA_22 | SCALE_GAMMA_BRIGHT |
SCALE_BANDWIDTH |
SCALE_OVERLAY_EN |
SCALE_EN); SCALE_EN);
media->SCALER_BUF0_OFFSET = pPortPriv->YBuf0Offset; media->SCALER_BUF0_OFFSET = pPortPriv->YBuf0Offset;
media->SCALER_BUF1_OFFSET = pPortPriv->YBuf0Offset; media->SCALER_BUF1_OFFSET = pPortPriv->YBuf0Offset;
media->SCALER_BUF0_OFFSET_U = pPortPriv->UBuf0Offset; media->SCALER_BUF0_OFFSET_U = pPortPriv->YBuf0Offset;
media->SCALER_BUF1_OFFSET_U = pPortPriv->UBuf1Offset; media->SCALER_BUF1_OFFSET_U = pPortPriv->YBuf1Offset;
media->SCALER_BUF0_OFFSET_V = pPortPriv->VBuf0Offset; media->SCALER_BUF0_OFFSET_V = pPortPriv->YBuf0Offset;
media->SCALER_BUF1_OFFSET_V = pPortPriv->VBuf1Offset; media->SCALER_BUF1_OFFSET_V = pPortPriv->YBuf1Offset;
media->SCALER_BUF_PITCH = src_w; media->SCALER_BUF_PITCH = dstPitch >> 1;
media->SCALER_HEIGHT_WIDTH = MACH64_YX(src_w, src_h); media->SCALER_HEIGHT_WIDTH = MACH64_YX(src_w - (x1 >> 16), src_h - (y1 >> 16));
media->SCALER_TEST + 0; media->SCALER_TEST = 0;
media->SCALER_COLOUR_CNTL = ((0 << 0) | /* BRIGHTNESS */ bright = (pPortPriv->brightness * 64 / 1000);
(0x10 << 8) | /* SATURATION_U */ if (bright < -0x40)
(0x10 << 16) | /* SATURATION_V */ bright = -0x40;
if (bright > 0x3f)
bright = 0x3f;
bright = bright & 0x7f;
sat = ((pPortPriv->saturation * 31 + 31000) / 2000);
if (sat > 0x1f)
sat = 0x1f;
if (sat < 0)
sat = 0;
media->SCALER_COLOUR_CNTL = ((bright << 0) | /* BRIGHTNESS */
(sat << 8) | /* SATURATION_U */
(sat << 16) | /* SATURATION_V */
(0 << 21) | /* SCALER_VERT_ADJ_UV */ (0 << 21) | /* SCALER_VERT_ADJ_UV */
(0 << 28)); /* SCALER_HORZ_ADJ_UV */ (0 << 28)); /* SCALER_HORZ_ADJ_UV */
switch(id) { if (id == FOURCC_UYVY)
case FOURCC_YV12:
case FOURCC_I420:
SCALER_IN = SCALER_IN_YUV_12;
swidth = (width + 7) & ~7;
break;
break;
case FOURCC_UYVY:
SCALER_IN = SCALER_IN_VYUY422;
break;
case FOURCC_YUY2:
SCALER_IN = SCALER_IN_YVYU422; SCALER_IN = SCALER_IN_YVYU422;
break; else
} SCALER_IN = SCALER_IN_VYUY422;
media->VIDEO_FORMAT = SCALER_IN | VIDEO_IN_VYUY422;
media->VIDEO_FORMAT = SCALER_IN;
media->CAPTURE_CONFIG = (OVL_BUF_MODE | media->CAPTURE_CONFIG = (OVL_BUF_MODE |
(pPortPriv->currentBuf == 0 ? (pPortPriv->currentBuf == 0 ?
0 : OVL_BUF_NEXT)); 0 : OVL_BUF_NEXT));
#if 0
switch(id) {
case FOURCC_YV12:
case FOURCC_I420:
overlay->OV0STRIDE = (dstPitch << 1) | (dstPitch << 16);
overlay->OV0CMD &= ~SOURCE_FORMAT;
overlay->OV0CMD |= YUV_420;
break;
case FOURCC_UYVY:
case FOURCC_YUY2:
default:
overlay->OV0STRIDE = dstPitch;
overlay->OV0CMD &= ~SOURCE_FORMAT;
overlay->OV0CMD |= YUV_422;
overlay->OV0CMD &= ~OV_BYTE_ORDER;
if (id == FOURCC_UYVY)
overlay->OV0CMD |= Y_SWAP;
break;
}
overlay->OV0CMD &= ~BUFFER_AND_FIELD;
if (pPriv->currentBuf == 0)
overlay->OV0CMD |= BUFFER0_FIELD0;
else
overlay->OV0CMD |= BUFFER1_FIELD0;
OVERLAY_UPDATE(i810c->OverlayPhysical);
#endif
/* set XY location and unlock */ /* set XY location and unlock */
media->OVERLAY_Y_X_START = MACH64_YX (x1, y1); media->OVERLAY_Y_X_START = MACH64_YX (dstBox->x1, dstBox->y1);
} }
static int static int
@ -455,7 +488,7 @@ mach64PutImage(KdScreenInfo *screen,
Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver; Mach64ScreenInfo *mach64s = (Mach64ScreenInfo *) screen->driver;
Mach64PortPrivPtr pPortPriv = (Mach64PortPrivPtr)data; Mach64PortPrivPtr pPortPriv = (Mach64PortPrivPtr)data;
INT32 x1, x2, y1, y2; INT32 x1, x2, y1, y2;
int srcPitch, dstPitch; int srcPitch, srcPitch2, dstPitch;
int top, left, npixels, nlines, size; int top, left, npixels, nlines, size;
BoxRec dstBox; BoxRec dstBox;
@ -479,16 +512,17 @@ mach64PutImage(KdScreenInfo *screen,
switch(id) { switch(id) {
case FOURCC_YV12: case FOURCC_YV12:
case FOURCC_I420: case FOURCC_I420:
dstPitch = ((width << 1) + 15) & ~15;
srcPitch = (width + 3) & ~3; srcPitch = (width + 3) & ~3;
dstPitch = ((width >> 1) + 7) & ~7; /* of chroma */ srcPitch2 = ((width >> 1) + 3) & ~3;
size = dstPitch * height * 3; size = dstPitch * height;
break; break;
case FOURCC_UYVY: case FOURCC_UYVY:
case FOURCC_YUY2: case FOURCC_YUY2:
default: default:
srcPitch = (width << 1); dstPitch = ((width << 1) + 15) & ~15;
dstPitch = (srcPitch + 7) & ~7;
size = dstPitch * height; size = dstPitch * height;
srcPitch = (width << 1);
break; break;
} }
@ -508,9 +542,11 @@ mach64PutImage(KdScreenInfo *screen,
#endif #endif
/* buffer swap */ /* buffer swap */
#if 0
if (pPortPriv->currentBuf == 0) if (pPortPriv->currentBuf == 0)
pPortPriv->currentBuf = 1; pPortPriv->currentBuf = 1;
else else
#endif
pPortPriv->currentBuf = 0; pPortPriv->currentBuf = 0;
/* copy data */ /* copy data */
@ -523,7 +559,7 @@ mach64PutImage(KdScreenInfo *screen,
case FOURCC_I420: case FOURCC_I420:
top &= ~1; top &= ~1;
nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top; nlines = ((((y2 + 0xffff) >> 16) + 1) & ~1) - top;
mach64CopyPlanarData(screen, buf, srcPitch, dstPitch, height, top, left, mach64CopyPlanarData(screen, buf, srcPitch, srcPitch2, dstPitch, height, top, left,
nlines, npixels, id); nlines, npixels, id);
break; break;
case FOURCC_UYVY: case FOURCC_UYVY:
@ -535,23 +571,14 @@ mach64PutImage(KdScreenInfo *screen,
break; break;
} }
#if 0
/* update cliplist */ /* update cliplist */
if(!RegionsEqual(&pPortPriv->clip, clipBoxes)) { if (!RegionsEqual (&pPortPriv->clip, clipBoxes))
REGION_COPY(pScreen, &pPortPriv->clip, clipBoxes); {
mach64FillBoxSolid(screen, REGION_NUM_RECTS(clipBoxes), REGION_COPY (screen->pScreen, &pPortPriv->clip, clipBoxes);
REGION_RECTS(clipBoxes), mach64PaintRegion (screen->pScreen, &pPortPriv->clip, pPortPriv->colorKey);
pPortPriv->colorKey, GXcopy, ~0);
/*
XAAFillSolidRects(screen, pPortPriv->colorKey, GXcopy, ~0,
REGION_NUM_RECTS(clipBoxes),
REGION_RECTS(clipBoxes));
*/
} }
#endif
mach64DisplayVideo(screen, id, width, height, dstPitch, mach64DisplayVideo(screen, id, width, height, dstPitch,
x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h); x1, y1, x2, y2, &dstBox, src_w, src_h, drw_w, drw_h);
pPortPriv->videoOn = TRUE; pPortPriv->videoOn = TRUE;
@ -631,9 +658,9 @@ static KdVideoFormatRec Formats[NUM_FORMATS] =
static KdAttributeRec Attributes[NUM_ATTRIBUTES] = static KdAttributeRec Attributes[NUM_ATTRIBUTES] =
{ {
{XvSettable | XvGettable, 0, (1 << 24) - 1, "XV_COLORKEY"}, {XvSettable | XvGettable, 0, ~0, "XV_COLORKEY"},
{XvSettable | XvGettable, -128, 127, "XV_BRIGHTNESS"}, {XvSettable | XvGettable, -1000, 1000, "XV_BRIGHTNESS"},
{XvSettable | XvGettable, 0, 255, "XV_CONTRAST"} {XvSettable | XvGettable, -1000, 1000, "XV_SATURATION"}
}; };
#define NUM_IMAGES 4 #define NUM_IMAGES 4
@ -718,7 +745,7 @@ mach64SetupImageVideo(ScreenPtr pScreen)
pPortPriv->colorKey = mach64s->colorKey & ((1 << screen->fb[0].depth) - 1); pPortPriv->colorKey = mach64s->colorKey & ((1 << screen->fb[0].depth) - 1);
pPortPriv->videoOn = FALSE; pPortPriv->videoOn = FALSE;
pPortPriv->brightness = 0; pPortPriv->brightness = 0;
pPortPriv->contrast = 128; pPortPriv->saturation = 0;
pPortPriv->currentBuf = 0; pPortPriv->currentBuf = 0;
/* gotta uninit this someplace */ /* gotta uninit this someplace */
@ -727,7 +754,7 @@ mach64SetupImageVideo(ScreenPtr pScreen)
mach64s->pAdaptor = adapt; mach64s->pAdaptor = adapt;
xvBrightness = MAKE_ATOM("XV_BRIGHTNESS"); xvBrightness = MAKE_ATOM("XV_BRIGHTNESS");
xvContrast = MAKE_ATOM("XV_CONTRAST"); xvSaturation = MAKE_ATOM("XV_SATURATION");
xvColorKey = MAKE_ATOM("XV_COLORKEY"); xvColorKey = MAKE_ATOM("XV_COLORKEY");
mach64ResetVideo(screen); mach64ResetVideo(screen);