mirror of
https://github.com/openbsd/xenocara.git
synced 2025-12-13 04:39:07 +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>
|
2009-09-26 Bartosz Kosiorek <gang65@poczta.onet.pl>
|
||||||
|
|
||||||
Save/restore ECK Clock Synthesizer
|
Save/restore ECK Clock Synthesizer
|
||||||
|
|||||||
@@ -418,10 +418,10 @@ typedef struct _VIA {
|
|||||||
Bool PrintVGARegs;
|
Bool PrintVGARegs;
|
||||||
Bool PrintTVRegs;
|
Bool PrintTVRegs;
|
||||||
Bool I2CScan;
|
Bool I2CScan;
|
||||||
|
#endif /* HAVE_DEBUG */
|
||||||
|
|
||||||
Bool UseLegacyModeSwitch ;
|
Bool UseLegacyModeSwitch ;
|
||||||
video_via_regs* VideoRegs ;
|
video_via_regs* VideoRegs ;
|
||||||
#endif /* HAVE_DEBUG */
|
|
||||||
} VIARec, *VIAPtr;
|
} VIARec, *VIAPtr;
|
||||||
|
|
||||||
#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate))
|
#define VIAPTR(p) ((VIAPtr)((p)->driverPrivate))
|
||||||
|
|||||||
@@ -466,8 +466,8 @@ viaResetVideo(ScrnInfoPtr pScrn)
|
|||||||
|
|
||||||
viaVidEng->video1_ctl = 0;
|
viaVidEng->video1_ctl = 0;
|
||||||
viaVidEng->video3_ctl = 0;
|
viaVidEng->video3_ctl = 0;
|
||||||
viaVidEng->compose = 0x80000000;
|
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||||
viaVidEng->compose = 0x40000000;
|
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||||
viaVidEng->color_key = 0x821;
|
viaVidEng->color_key = 0x821;
|
||||||
viaVidEng->snd_color_key = 0x821;
|
viaVidEng->snd_color_key = 0x821;
|
||||||
|
|
||||||
@@ -479,16 +479,16 @@ viaSaveVideo(ScrnInfoPtr pScrn)
|
|||||||
VIAPtr pVia = VIAPTR(pScrn);
|
VIAPtr pVia = VIAPTR(pScrn);
|
||||||
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
||||||
|
|
||||||
|
DBG_DD(ErrorF(" via_video.c : viaSaveVideo : \n"));
|
||||||
/* Save video registers */
|
/* Save video registers */
|
||||||
/* TODO: Identify which registers should be saved and restored */
|
|
||||||
memcpy(pVia->VideoRegs, (void*)viaVidEng, sizeof(video_via_regs));
|
memcpy(pVia->VideoRegs, (void*)viaVidEng, sizeof(video_via_regs));
|
||||||
|
|
||||||
pVia->dwV1 = ((vmmtr) viaVidEng)->video1_ctl;
|
pVia->dwV1 = ((vmmtr) viaVidEng)->video1_ctl;
|
||||||
pVia->dwV3 = ((vmmtr) viaVidEng)->video3_ctl;
|
pVia->dwV3 = ((vmmtr) viaVidEng)->video3_ctl;
|
||||||
viaVidEng->video1_ctl = 0;
|
viaVidEng->video1_ctl = 0;
|
||||||
viaVidEng->video3_ctl = 0;
|
viaVidEng->video3_ctl = 0;
|
||||||
viaVidEng->compose = 0x80000000;
|
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||||
viaVidEng->compose = 0x40000000;
|
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -496,16 +496,65 @@ viaRestoreVideo(ScrnInfoPtr pScrn)
|
|||||||
{
|
{
|
||||||
VIAPtr pVia = VIAPTR(pScrn);
|
VIAPtr pVia = VIAPTR(pScrn);
|
||||||
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
vmmtr viaVidEng = (vmmtr) pVia->VidMapBase;
|
||||||
|
video_via_regs *localVidEng = pVia->VideoRegs;
|
||||||
|
|
||||||
|
|
||||||
|
DBG_DD(ErrorF(" via_video.c : viaRestoreVideo : \n"));
|
||||||
/* Restore video registers */
|
/* Restore video registers */
|
||||||
/* TODO: Identify which registers should be saved and restored */
|
/* flush restored video engines' setting to VidMapBase */
|
||||||
memcpy((void*)viaVidEng, pVia->VideoRegs, sizeof(video_via_regs));
|
|
||||||
|
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->video1_ctl = pVia->dwV1;
|
||||||
viaVidEng->video3_ctl = pVia->dwV3;
|
viaVidEng->video3_ctl = pVia->dwV3;
|
||||||
viaVidEng->compose = 0x80000000;
|
if (pVia->ChipId != PCI_CHIP_VT3314)
|
||||||
viaVidEng->compose = 0x40000000;
|
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||||
|
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
@@ -524,8 +573,8 @@ viaExitVideo(ScrnInfoPtr pScrn)
|
|||||||
|
|
||||||
viaVidEng->video1_ctl = 0;
|
viaVidEng->video1_ctl = 0;
|
||||||
viaVidEng->video3_ctl = 0;
|
viaVidEng->video3_ctl = 0;
|
||||||
viaVidEng->compose = 0x80000000;
|
viaVidEng->compose = V1_COMMAND_FIRE;
|
||||||
viaVidEng->compose = 0x40000000;
|
viaVidEng->compose = V3_COMMAND_FIRE;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Free all adaptor info allocated in viaInitVideo.
|
* Free all adaptor info allocated in viaInitVideo.
|
||||||
@@ -664,105 +713,6 @@ RegionsEqual(RegionPtr A, RegionPtr B)
|
|||||||
return TRUE;
|
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.
|
* This one gets called, for example, on panning.
|
||||||
@@ -783,10 +733,15 @@ viaReputImage(ScrnInfoPtr pScrn,
|
|||||||
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
||||||
if (pPriv->autoPaint) {
|
if (pPriv->autoPaint) {
|
||||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
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 {
|
} else {
|
||||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey,
|
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||||
clipBoxes);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -1296,7 +1251,7 @@ viaPutImage(ScrnInfoPtr pScrn,
|
|||||||
unsigned long retCode;
|
unsigned long retCode;
|
||||||
|
|
||||||
# ifdef XV_DEBUG
|
# 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,
|
ErrorF(" via_video.c : FourCC=0x%x width=%d height=%d sync=%d\n", id,
|
||||||
width, height, sync);
|
width, height, sync);
|
||||||
ErrorF
|
ErrorF
|
||||||
@@ -1405,12 +1360,11 @@ viaPutImage(ScrnInfoPtr pScrn,
|
|||||||
|
|
||||||
lpUpdateOverlay->dwFlags = DDOVER_KEYDEST;
|
lpUpdateOverlay->dwFlags = DDOVER_KEYDEST;
|
||||||
|
|
||||||
if (pScrn->bitsPerPixel == 8)
|
if (pScrn->bitsPerPixel == 8) {
|
||||||
lpUpdateOverlay->dwColorSpaceLowValue =
|
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey & 0xff;
|
||||||
pPriv->colorKey & 0xff;
|
} else {
|
||||||
else
|
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey;
|
||||||
lpUpdateOverlay->dwColorSpaceLowValue = pPriv->colorKey;
|
}
|
||||||
|
|
||||||
/* If use extend FIFO mode */
|
/* If use extend FIFO mode */
|
||||||
if (pScrn->currentMode->HDisplay > 1024) {
|
if (pScrn->currentMode->HDisplay > 1024) {
|
||||||
dwUseExtendedFIFO = 1;
|
dwUseExtendedFIFO = 1;
|
||||||
@@ -1458,12 +1412,19 @@ viaPutImage(ScrnInfoPtr pScrn,
|
|||||||
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
REGION_COPY(pScrn->pScreen, &pPriv->clip, clipBoxes);
|
||||||
if (pPriv->autoPaint) {
|
if (pPriv->autoPaint) {
|
||||||
if (pDraw->type == DRAWABLE_WINDOW) {
|
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 {
|
} else {
|
||||||
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey,
|
xf86XVFillKeyHelper(pScrn->pScreen, pPriv->colorKey, clipBoxes);
|
||||||
clipBoxes);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
} else {
|
||||||
|
DBG_DD(ErrorF(" via_video.c : // No need to draw Colorkey!! \n"));
|
||||||
}
|
}
|
||||||
/*
|
/*
|
||||||
* Update video overlay
|
* Update video overlay
|
||||||
|
|||||||
@@ -44,6 +44,10 @@
|
|||||||
|
|
||||||
#define VIDEO_BPP 2
|
#define VIDEO_BPP 2
|
||||||
|
|
||||||
|
|
||||||
|
#define V1_COMMAND_FIRE 0x80000000 /* V1 commands fire */
|
||||||
|
#define V3_COMMAND_FIRE 0x40000000 /* V3 commands fire */
|
||||||
|
|
||||||
typedef struct
|
typedef struct
|
||||||
{
|
{
|
||||||
CARD32 interruptflag; /* 200 */
|
CARD32 interruptflag; /* 200 */
|
||||||
@@ -89,7 +93,7 @@ typedef struct
|
|||||||
CARD32 video3_ctl; /* 2a0 */
|
CARD32 video3_ctl; /* 2a0 */
|
||||||
CARD32 video3_addr0; /* 2a4 */
|
CARD32 video3_addr0; /* 2a4 */
|
||||||
CARD32 video3_addr1; /* 2a8 */
|
CARD32 video3_addr1; /* 2a8 */
|
||||||
CARD32 video3_stribe; /* 2ac */
|
CARD32 video3_stride; /* 2ac */
|
||||||
CARD32 video3_hvstart; /* 2b0 */
|
CARD32 video3_hvstart; /* 2b0 */
|
||||||
CARD32 video3_size; /* 2b4 */
|
CARD32 video3_size; /* 2b4 */
|
||||||
CARD32 v3alpha_fetch; /* 2b8 */
|
CARD32 v3alpha_fetch; /* 2b8 */
|
||||||
|
|||||||
Reference in New Issue
Block a user