diff options
author | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2010-08-21 14:00:59 +0000 |
---|---|---|
committer | Matthieu Herrb <matthieu@cvs.openbsd.org> | 2010-08-21 14:00:59 +0000 |
commit | e5b46c6b85adc1d40ac05f83e0638638e99d2b24 (patch) | |
tree | bf5ef352172cf31dcf52c371128476893874cb24 | |
parent | 3ffa6e448b797bf8f6184c458a8c548e4503cc87 (diff) |
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
-rw-r--r-- | driver/xf86-video-openchrome/ChangeLog | 16 | ||||
-rw-r--r-- | driver/xf86-video-openchrome/src/via_driver.h | 2 | ||||
-rw-r--r-- | driver/xf86-video-openchrome/src/via_video.c | 211 | ||||
-rw-r--r-- | driver/xf86-video-openchrome/src/via_video.h | 6 |
4 files changed, 108 insertions, 127 deletions
diff --git a/driver/xf86-video-openchrome/ChangeLog b/driver/xf86-video-openchrome/ChangeLog index 5d493e6bc..9eaa0d9fa 100644 --- a/driver/xf86-video-openchrome/ChangeLog +++ b/driver/xf86-video-openchrome/ChangeLog @@ -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 diff --git a/driver/xf86-video-openchrome/src/via_driver.h b/driver/xf86-video-openchrome/src/via_driver.h index 3b0282959..be9f0ebc3 100644 --- a/driver/xf86-video-openchrome/src/via_driver.h +++ b/driver/xf86-video-openchrome/src/via_driver.h @@ -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)) diff --git a/driver/xf86-video-openchrome/src/via_video.c b/driver/xf86-video-openchrome/src/via_video.c index c605f1165..b9883dbbe 100644 --- a/driver/xf86-video-openchrome/src/via_video.c +++ b/driver/xf86-video-openchrome/src/via_video.c @@ -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 diff --git a/driver/xf86-video-openchrome/src/via_video.h b/driver/xf86-video-openchrome/src/via_video.h index 47a4d24fb..03b33c945 100644 --- a/driver/xf86-video-openchrome/src/via_video.h +++ b/driver/xf86-video-openchrome/src/via_video.h @@ -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 */ |