mirror of
https://github.com/openbsd/xenocara.git
synced 2025-12-08 18:28:43 +00:00
Merge commits 838 and 840 from trunk:
Fix bug with suspend and VT switch on VX800 and 64bit systems (tested by jakemsr@) Fix segfaults with EXA and XV (Ticket #359) Tested on K8M890 and VN800
This commit is contained in:
@@ -1,3 +1,19 @@
|
||||
2010-03-07 Bartosz Kosiorek <gang65@poczta.onet.pl>
|
||||
|
||||
Fix segfaults with EXA and XV (Ticket #359)
|
||||
Tested on K8M890 and VN800
|
||||
|
||||
* src/via_video.c: (viaReputImage), (viaPutImage):
|
||||
|
||||
2010-02-10 Bartosz Kosiorek <gang65@poczta.onet.pl>
|
||||
|
||||
Fix bug with suspend and VT switch on VX800 and 64bit systems
|
||||
|
||||
* src/via_driver.h:
|
||||
* src/via_video.c: (viaResetVideo), (viaSaveVideo),
|
||||
(viaRestoreVideo), (viaExitVideo):
|
||||
* src/via_video.h:
|
||||
|
||||
2009-09-26 Bartosz Kosiorek <gang65@poczta.onet.pl>
|
||||
|
||||
Save/restore ECK Clock Synthesizer
|
||||
|
||||
@@ -418,10 +418,10 @@ typedef struct _VIA {
|
||||
Bool PrintVGARegs;
|
||||
Bool PrintTVRegs;
|
||||
Bool I2CScan;
|
||||
#endif /* HAVE_DEBUG */
|
||||
|
||||
Bool UseLegacyModeSwitch ;
|
||||
video_via_regs* VideoRegs ;
|
||||
#endif /* HAVE_DEBUG */
|
||||
} VIARec, *VIAPtr;
|
||||
|
||||
#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate))
|
||||
|
||||
@@ -466,8 +466,8 @@ viaResetVideo(ScrnInfoPtr pScrn)
|
||||
|
||||
viaVidEng->video1_ctl = 0;
|
||||
viaVidEng->video3_ctl = 0;
|
||||
viaVidEng->compose = 0x80000000;
|
||||
viaVidEng->compose = 0x40000000;
|
||||
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||
viaVidEng->color_key = 0x821;
|
||||
viaVidEng->snd_color_key = 0x821;
|
||||
|
||||
@@ -479,16 +479,16 @@ viaSaveVideo(ScrnInfoPtr pScrn)
|
||||
VIAPtr pVia = VIAPTR(pScrn);
|
||||
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
||||
|
||||
DBG_DD(ErrorF(" via_video.c : viaSaveVideo : \n"));
|
||||
/* Save video registers */
|
||||
/* TODO: Identify which registers should be saved and restored */
|
||||
memcpy(pVia->VideoRegs, (void*)viaVidEng, sizeof(video_via_regs));
|
||||
|
||||
pVia->dwV1 = ((vmmtr) viaVidEng)->video1_ctl;
|
||||
pVia->dwV3 = ((vmmtr) viaVidEng)->video3_ctl;
|
||||
viaVidEng->video1_ctl = 0;
|
||||
viaVidEng->video3_ctl = 0;
|
||||
viaVidEng->compose = 0x80000000;
|
||||
viaVidEng->compose = 0x40000000;
|
||||
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -496,16 +496,65 @@ viaRestoreVideo(ScrnInfoPtr pScrn)
|
||||
{
|
||||
VIAPtr pVia = VIAPTR(pScrn);
|
||||
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
||||
video_via_regs *localVidEng = pVia->VideoRegs;
|
||||
|
||||
|
||||
DBG_DD(ErrorF(" via_video.c : viaRestoreVideo : \n"));
|
||||
/* Restore video registers */
|
||||
/* TODO: Identify which registers should be saved and restored */
|
||||
memcpy((void*)viaVidEng, pVia->VideoRegs, sizeof(video_via_regs));
|
||||
|
||||
/* flush restored video engines' setting to VidMapBase */
|
||||
|
||||
viaVidEng->alphawin_hvstart = localVidEng->alphawin_hvstart;
|
||||
viaVidEng->alphawin_size = localVidEng->alphawin_size;
|
||||
viaVidEng->alphawin_ctl = localVidEng->alphawin_ctl;
|
||||
viaVidEng->alphafb_stride = localVidEng->alphafb_stride;
|
||||
viaVidEng->color_key = localVidEng->color_key;
|
||||
viaVidEng->alphafb_addr = localVidEng->alphafb_addr;
|
||||
viaVidEng->chroma_low = localVidEng->chroma_low;
|
||||
viaVidEng->chroma_up = localVidEng->chroma_up;
|
||||
|
||||
if (pVia->ChipId != PCI_CHIP_VT3314)
|
||||
{
|
||||
/*VT3314 only has V3*/
|
||||
viaVidEng->video1_ctl = localVidEng->video1_ctl;
|
||||
viaVidEng->video1_fetch = localVidEng->video1_fetch;
|
||||
viaVidEng->video1y_addr1 = localVidEng->video1y_addr1;
|
||||
viaVidEng->video1_stride = localVidEng->video1_stride;
|
||||
viaVidEng->video1_hvstart = localVidEng->video1_hvstart;
|
||||
viaVidEng->video1_size = localVidEng->video1_size;
|
||||
viaVidEng->video1y_addr2 = localVidEng->video1y_addr2;
|
||||
viaVidEng->video1_zoom = localVidEng->video1_zoom;
|
||||
viaVidEng->video1_mictl = localVidEng->video1_mictl;
|
||||
viaVidEng->video1y_addr0 = localVidEng->video1y_addr0;
|
||||
viaVidEng->video1_fifo = localVidEng->video1_fifo;
|
||||
viaVidEng->video1y_addr3 = localVidEng->video1y_addr3;
|
||||
viaVidEng->v1_source_w_h = localVidEng->v1_source_w_h ;
|
||||
viaVidEng->video1_CSC1 = localVidEng->video1_CSC1;
|
||||
viaVidEng->video1_CSC2 = localVidEng->video1_CSC2;
|
||||
}
|
||||
viaVidEng->snd_color_key = localVidEng->snd_color_key;
|
||||
viaVidEng->v3alpha_prefifo = localVidEng->v3alpha_prefifo;
|
||||
viaVidEng->v3alpha_fifo = localVidEng->v3alpha_fifo;
|
||||
viaVidEng->video3_CSC2 = localVidEng->video3_CSC2;
|
||||
viaVidEng->video3_CSC2 = localVidEng->video3_CSC2;
|
||||
viaVidEng->v3_source_width = localVidEng->v3_source_width;
|
||||
viaVidEng->video3_ctl = localVidEng->video3_ctl;
|
||||
viaVidEng->video3_addr0 = localVidEng->video3_addr0;
|
||||
viaVidEng->video3_addr1 = localVidEng->video3_addr1;
|
||||
viaVidEng->video3_stride = localVidEng->video3_stride;
|
||||
viaVidEng->video3_hvstart = localVidEng->video3_hvstart;
|
||||
viaVidEng->video3_size = localVidEng->video3_size;
|
||||
viaVidEng->v3alpha_fetch = localVidEng->v3alpha_fetch;
|
||||
viaVidEng->video3_zoom = localVidEng->video3_zoom;
|
||||
viaVidEng->video3_mictl = localVidEng->video3_mictl;
|
||||
viaVidEng->video3_CSC1 = localVidEng->video3_CSC1;
|
||||
viaVidEng->video3_CSC2 = localVidEng->video3_CSC2;
|
||||
viaVidEng->compose = localVidEng->compose;
|
||||
|
||||
viaVidEng->video1_ctl = pVia->dwV1;
|
||||
viaVidEng->video3_ctl = pVia->dwV3;
|
||||
viaVidEng->compose = 0x80000000;
|
||||
viaVidEng->compose = 0x40000000;
|
||||
|
||||
if (pVia->ChipId != PCI_CHIP_VT3314)
|
||||
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||
}
|
||||
|
||||
void
|
||||
@@ -524,8 +573,8 @@ viaExitVideo(ScrnInfoPtr pScrn)
|
||||
|
||||
viaVidEng->video1_ctl = 0;
|
||||
viaVidEng->video3_ctl = 0;
|
||||
viaVidEng->compose = 0x80000000;
|
||||
viaVidEng->compose = 0x40000000;
|
||||
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||
|
||||
/*
|
||||
* Free all adaptor info allocated in viaInitVideo.
|
||||
@@ -664,105 +713,6 @@ RegionsEqual(RegionPtr A, RegionPtr B)
|
||||
return TRUE;
|
||||
}
|
||||
|
||||
static void
|
||||
viaVideoFillPixmap(ScrnInfoPtr pScrn,
|
||||
char *base,
|
||||
unsigned long pitch,
|
||||
int depth,
|
||||
int x, int y, int w, int h,
|
||||
unsigned long color)
|
||||
{
|
||||
int i;
|
||||
|
||||
ErrorF("pitch %lu, depth %d, x %d, y %d, w %d, h %d, color 0x%08lx\n",
|
||||
pitch, depth, x, y, w, h, color);
|
||||
|
||||
depth = (depth + 7) >> 3;
|
||||
|
||||
base += y*pitch + x*depth;
|
||||
|
||||
switch(depth) {
|
||||
case 4:
|
||||
while(h--) {
|
||||
register CARD32 *p = (CARD32 *)base;
|
||||
for (i=0; i<w; ++i) {
|
||||
*p++ = color;
|
||||
}
|
||||
base += pitch;
|
||||
}
|
||||
break;
|
||||
case 2: {
|
||||
register CARD16 col = color & 0x0000FFFF;
|
||||
while(h--) {
|
||||
register CARD16 *p = (CARD16 *)base;
|
||||
for (i=0; i<w; ++i) {
|
||||
*p++ = col;
|
||||
}
|
||||
base += pitch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
case 1: {
|
||||
register CARD8 col = color & 0xFF;
|
||||
while(h--) {
|
||||
register CARD8 *p = (CARD8 *)base;
|
||||
for (i=0; i<w; ++i) {
|
||||
*p++ = col;
|
||||
}
|
||||
base += pitch;
|
||||
}
|
||||
break;
|
||||
}
|
||||
default:
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
|
||||
static int
|
||||
viaPaintColorkey(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, RegionPtr clipBoxes,
|
||||
DrawablePtr pDraw)
|
||||
{
|
||||
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
|
||||
VIAPtr pVia = VIAPTR(pScrn);
|
||||
PixmapPtr pPix = (pScrn->pScreen->GetWindowPixmap)((WindowPtr) pDraw);
|
||||
unsigned long pitch = pPix->devKind;
|
||||
long offset = (long) pPix->devPrivate.ptr - (long) pVia->FBBase;
|
||||
int x,y;
|
||||
BoxPtr pBox;
|
||||
int nBox;
|
||||
|
||||
REGION_TRANSLATE(pScrn->pScreen, clipBoxes, - pPix->screen_x,
|
||||
- pPix->screen_y);
|
||||
|
||||
nBox = REGION_NUM_RECTS(clipBoxes);
|
||||
pBox = REGION_RECTS(clipBoxes);
|
||||
|
||||
while(nBox--) {
|
||||
if (pVia->NoAccel || offset < 0 ||
|
||||
offset > pScrn->videoRam*1024) {
|
||||
viaVideoFillPixmap(pScrn, pPix->devPrivate.ptr, pitch,
|
||||
pDraw->bitsPerPixel, pBox->x1, pBox->y1,
|
||||
pBox->x2 - pBox->x1, pBox->y2 - pBox->y1,
|
||||
pPriv->colorKey);
|
||||
} else {
|
||||
viaAccelFillPixmap(pScrn, offset, pitch,
|
||||
pDraw->bitsPerPixel, pBox->x1, pBox->y1,
|
||||
pBox->x2 - pBox->x1, pBox->y2 - pBox->y1,
|
||||
pPriv->colorKey);
|
||||
}
|
||||
pBox++;
|
||||
}
|
||||
|
||||
DamageDamageRegion(pPix, clipBoxes);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* This one gets called, for example, on panning.
|
||||
@@ -783,10 +733,15 @@ viaReputImage(ScrnInfoPtr pScrn,
|
||||
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
||||
if (pPriv->autoPaint) {
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
viaPaintColorkey(pScrn, pPriv, clipBoxes, pDraw);
|
||||
/* TODO Replace xf86XVFillKeyHelper with xf86XVFillKeyHelperDrawable
|
||||
Currently resizing problem exist in VLC Media Player
|
||||
Example of implementation:
|
||||
xf86XVFillKeyHelperDrawable(pDraw, pPriv->colorKey, clipBoxes);
|
||||
DamageDamageRegion(pDraw, clipBoxes); */
|
||||
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||
} else {
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey,
|
||||
clipBoxes);
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1296,7 +1251,7 @@ viaPutImage(ScrnInfoPtr pScrn,
|
||||
unsigned long retCode;
|
||||
|
||||
# ifdef XV_DEBUG
|
||||
ErrorF(" via_video.c : viaPutImage : called\n");
|
||||
ErrorF(" via_video.c : viaPutImage : called, Screen[%d]\n", pScrn->scrnIndex);
|
||||
ErrorF(" via_video.c : FourCC=0x%x width=%d height=%d sync=%d\n", id,
|
||||
width, height, sync);
|
||||
ErrorF
|
||||
@@ -1405,12 +1360,11 @@ viaPutImage(ScrnInfoPtr pScrn,
|
||||
|
||||
lpUpdateOverlay->dwFlags = DDOVER_KEYDEST;
|
||||
|
||||
if (pScrn->bitsPerPixel == 8)
|
||||
lpUpdateOverlay->dwColorSpaceLowValue =
|
||||
pPriv->colorKey & 0xff;
|
||||
else
|
||||
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey;
|
||||
|
||||
if (pScrn->bitsPerPixel == 8) {
|
||||
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey & 0xff;
|
||||
} else {
|
||||
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey;
|
||||
}
|
||||
/* If use extend FIFO mode */
|
||||
if (pScrn->currentMode->HDisplay > 1024) {
|
||||
dwUseExtendedFIFO = 1;
|
||||
@@ -1458,12 +1412,19 @@ viaPutImage(ScrnInfoPtr pScrn,
|
||||
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
||||
if (pPriv->autoPaint) {
|
||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
||||
viaPaintColorkey(pScrn, pPriv, clipBoxes, pDraw);
|
||||
/* TODO Replace xf86XVFillKeyHelper with xf86XVFillKeyHelperDrawable
|
||||
Currently resizing problem exists in VLC Media Player
|
||||
Example of implementation:
|
||||
xf86XVFillKeyHelperDrawable(pDraw, pPriv->colorKey, clipBoxes);
|
||||
DamageDamageRegion(pDraw, clipBoxes);
|
||||
*/
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||
} else {
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey,
|
||||
clipBoxes);
|
||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||
}
|
||||
}
|
||||
} else {
|
||||
DBG_DD(ErrorF(" via_video.c : // No need to draw Colorkey!! \n"));
|
||||
}
|
||||
/*
|
||||
* Update video overlay
|
||||
|
||||
@@ -44,6 +44,10 @@
|
||||
|
||||
#define VIDEO_BPP 2
|
||||
|
||||
|
||||
#define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */
|
||||
#define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */
|
||||
|
||||
typedef struct
|
||||
{
|
||||
CARD32 interruptflag; /* 200 */
|
||||
@@ -89,7 +93,7 @@ typedef struct
|
||||
CARD32 video3_ctl; /* 2a0 */
|
||||
CARD32 video3_addr0; /* 2a4 */
|
||||
CARD32 video3_addr1; /* 2a8 */
|
||||
CARD32 video3_stribe; /* 2ac */
|
||||
CARD32 video3_stride; /* 2ac */
|
||||
CARD32 video3_hvstart; /* 2b0 */
|
||||
CARD32 video3_size; /* 2b4 */
|
||||
CARD32 v3alpha_fetch; /* 2b8 */
|
||||
|
||||
Reference in New Issue
Block a user