ChangeLog | 18 ++++++++++++++++++ src/via_accel.c | 13 +++++++++++-- src/via_id.c | 3 +++ src/via_vgahw.c | 9 +++++++-- src/via_video.c | 23 ++++++++++++++++++++--- 5 files changed, 59 insertions(+), 7 deletions(-)
New commits: commit 7ee9a581e9047b391619c403e5c9898dab9fab4f Author: schlobinux <schlobinux@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Fri Dec 9 18:02:43 2011 +0000 Handle X server 1.12 (videoabi 12) (patch from Adam Jackson) git-svn-id: http://svn.openchrome.org/svn/trunk@1050 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_vgahw.c b/src/via_vgahw.c index 0123f10..34ab91f 100644 --- a/src/via_vgahw.c +++ b/src/via_vgahw.c @@ -36,6 +36,11 @@ #include "via_driver.h" /* for HAVE_DEBUG */ #include "via_vgahw.h" +#if ABI_VIDEODRV_VERSION < 12 +#define PIOOFFSET hwp->PIOOffset +#else +#define PIOOFFSET 0 +#endif static CARD8 ViaVgahwIn(vgaHWPtr hwp, int address) @@ -43,7 +48,7 @@ ViaVgahwIn(vgaHWPtr hwp, int address) if (hwp->MMIOBase) return MMIO_IN8(hwp->MMIOBase, hwp->MMIOOffset + address); else - return inb(hwp->PIOOffset + address); + return inb(PIOOFFSET + address); } static void @@ -52,7 +57,7 @@ ViaVgahwOut(vgaHWPtr hwp, int address, CARD8 value) if (hwp->MMIOBase) MMIO_OUT8(hwp->MMIOBase, hwp->MMIOOffset + address, value); else - outb(hwp->PIOOffset + address, value); + outb(PIOOFFSET + address, value); } /* commit 8f697531c0ce7c635aef54ade435457f9cf7f2e7 Author: schlobinux <schlobinux@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Tue Nov 22 20:25:44 2011 +0000 ASRock PV530 git-svn-id: http://svn.openchrome.org/svn/trunk@1037 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_id.c b/src/via_id.c index bd37f32..c352535 100644 --- a/src/via_id.c +++ b/src/via_id.c @@ -249,6 +249,7 @@ static struct ViaCardIdStruct ViaCardId[] = { /*** VX900 ***/ {"Foxconn L740", VIA_VX900, 0x105B, 0x0CFD, VIA_DEVICE_LCD | VIA_DEVICE_CRT}, {"HP T5550 Thin Client", VIA_VX900, 0x1106, 0x7122, VIA_DEVICE_CRT}, + {"ASRock PV530", VIA_VX900, 0x1849, 0x7122, VIA_DEVICE_CRT}, /* keep this */ commit 6004608049cb9e96ffb5c48fbabaa79f7474eb44 Author: schlobinux <schlobinux@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Thu Oct 20 20:11:38 2011 +0000 Hewlett Packard DX2020 git-svn-id: http://svn.openchrome.org/svn/trunk@1014 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_id.c b/src/via_id.c index 2a2c894..bd37f32 100644 --- a/src/via_id.c +++ b/src/via_id.c @@ -144,6 +144,7 @@ static struct ViaCardIdStruct ViaCardId[] = { {"ECS P4M800PRO-M2 (V2.0)", VIA_VM800, 0x1019, 0x2123, VIA_DEVICE_CRT}, {"ECS C7VCM", VIA_VM800, 0x1019, 0xAA2D, VIA_DEVICE_CRT}, {"PCChips V21G", VIA_VM800, 0x1019, 0xAA51, VIA_DEVICE_CRT}, + {"Hewlett Packard DX2020", VIA_VM800, 0x103C, 0x3027, VIA_DEVICE_CRT}, {"Asustek P5VDC-MX", VIA_VM800, 0x1043, 0x3344, VIA_DEVICE_CRT}, {"Asustek P5VDC-TVM", VIA_VM800, 0x1043, 0x81CE, VIA_DEVICE_CRT}, {"Foxconn P4M800P7MB-RS2H", VIA_VM800, 0x105B, 0x0CF0, VIA_DEVICE_CRT}, commit 2946b09c2099293493621090acf4a77602b32a3e Author: schlobinux <schlobinux@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Sat Jul 23 22:25:03 2011 +0000 MSI PM9M-V (reported by Florin Rentea) git-svn-id: http://svn.openchrome.org/svn/trunk@933 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_id.c b/src/via_id.c index d5f5fdb..2a2c894 100644 --- a/src/via_id.c +++ b/src/via_id.c @@ -193,6 +193,7 @@ static struct ViaCardIdStruct ViaCardId[] = { {"Gigabyte GA-VM900M", VIA_P4M900, 0x1458, 0xD000, VIA_DEVICE_CRT}, {"MSI VR321", VIA_P4M900, 0x1462, 0x3355, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"MSI P4M900M / P4M900M2-F/L", VIA_P4M900, 0x1462, 0x7255, VIA_DEVICE_CRT}, + {"MSI PM9M-V", VIA_P4M900, 0x1462, 0x7364, VIA_DEVICE_CRT}, {"MSI P4M900M3-L", VIA_P4M900, 0x1462, 0x7387, VIA_DEVICE_CRT}, {"Twinhead H12V", VIA_P4M900, 0x14FF, 0xA00F, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, {"Twinhead K15V", VIA_P4M900, 0x14FF, 0xA012, VIA_DEVICE_CRT | VIA_DEVICE_LCD}, commit dec88b62f22aad54ff842c5117b4b9dba1d5a79f Author: gang65 <gang65@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Tue May 10 16:36:25 2011 +0000 Workaround EXA crash with new libcairo2 (#298) git-svn-id: http://svn.openchrome.org/svn/trunk@925 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/ChangeLog b/ChangeLog index 82049f6..04f0642 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-05-10 Bartosz Kosiorek <gan...@poczta.onet.pl> + + Workaround EXA crash with new libcairo2 (#298) + + * src/via_accel.c: (viaExaPrepareComposite): + 2011-05-08 Bartosz Kosiorek <gan...@poczta.onet.pl> Fix cursor garbage after suspend/resume for Xserver 1.10 (#405) diff --git a/src/via_accel.c b/src/via_accel.c index df8cbc1..2cd77b3 100644 --- a/src/via_accel.c +++ b/src/via_accel.c @@ -2202,6 +2202,13 @@ viaExaPrepareComposite(int op, PicturePtr pSrcPicture, Bool isAGP; unsigned long offset; + /* Workaround: EXA crash with new libcairo2 on a VIA VX800 (#298) */ + /* TODO Add real source only pictures */ + if (!pSrc) { + ErrorF("pSrc is NULL\n"); + return FALSE; + } + v3d->setDestination(v3d, exaGetPixmapOffset(pDst), exaGetPixmapPitch(pDst), pDstPicture->format); v3d->setCompositeOperator(v3d, op); commit 73ec5db535367bc724c717bb445560171e287d27 Author: gang65 <gang65@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Sun May 8 19:02:30 2011 +0000 Fix cursor garbage after suspen/resume for VX855 and VX900 (#405) git-svn-id: http://svn.openchrome.org/svn/trunk@924 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/ChangeLog b/ChangeLog index 2f3bb5c..82049f6 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-05-08 Bartosz Kosiorek <gan...@poczta.onet.pl> + + Fix cursor garbage after suspend/resume for Xserver 1.10 (#405) + + * src/via_video.c: (viaRestoreVideo): + 2011-05-04 Bartosz Kosiorek <gan...@poczta.onet.pl> Fix XAA displaying issues diff --git a/src/via_video.c b/src/via_video.c index 58538d8..e5238a3 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -536,9 +536,25 @@ viaRestoreVideo(ScrnInfoPtr pScrn) 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->v1_source_w_h = localVidEng->v1_source_w_h; viaVidEng->video1_CSC1 = localVidEng->video1_CSC1; viaVidEng->video1_CSC2 = localVidEng->video1_CSC2; + + /* Fix cursor garbage after suspend for VX855 and VX900 (#405) */ + /* 0x2E4 T Signature Data Result 1 */ + viaVidEng->video1u_addr1 = localVidEng->video1u_addr1; + /* 0x2E8 HI for Primary Display FIFO Control Signal */ + viaVidEng->video1u_addr2 = localVidEng->video1u_addr2; + /* 0x2EC HI for Primary Display FIFO Transparent color */ + viaVidEng->video1u_addr3 = localVidEng->video1u_addr3; + /* 0x2F0 HI for Primary Display Control Signal */ + viaVidEng->video1v_addr0 = localVidEng->video1v_addr0; + /* 0x2F4 HI for Primary Display Frame Buffer Starting Address */ + viaVidEng->video1v_addr1 = localVidEng->video1v_addr1; + /* 0x2F8 HI for Primary Display Horizontal and Vertical Start */ + viaVidEng->video1v_addr2 = localVidEng->video1v_addr2; + /* 0x2FC HI for Primary Display Center Offset */ + viaVidEng->video1v_addr3 = localVidEng->video1v_addr3; } viaVidEng->snd_color_key = localVidEng->snd_color_key; viaVidEng->v3alpha_prefifo = localVidEng->v3alpha_prefifo; @@ -559,10 +575,11 @@ viaRestoreVideo(ScrnInfoPtr pScrn) viaVidEng->video3_CSC2 = localVidEng->video3_CSC2; viaVidEng->compose = localVidEng->compose; - viaVidEng->video1_ctl = pVia->dwV1; viaVidEng->video3_ctl = pVia->dwV3; - if (pVia->ChipId != PCI_CHIP_VT3314) + if (pVia->ChipId != PCI_CHIP_VT3314) { + viaVidEng->video1_ctl = pVia->dwV1; viaVidEng->compose = V1_COMMAND_FIRE; + } viaVidEng->compose = V3_COMMAND_FIRE; } commit e53f15b9d2e16b580cc0b48ea95c294e956c3a82 Author: gang65 <gang65@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Sun May 8 18:02:02 2011 +0000 Revert r922 changes (it added I420 support) git-svn-id: http://svn.openchrome.org/svn/trunk@923 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_swov.c b/src/via_swov.c index c2c7d6f..1f9aff9 100644 --- a/src/via_swov.c +++ b/src/via_swov.c @@ -392,7 +392,6 @@ viaOverlayGetV1V3Format(VIAPtr pVia, int vport, /* 1 or 3, as in V1 or V3 */ if (videoFlag & VIDEO_HQV_INUSE) { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: - case FOURCC_I420: case FOURCC_XVMC: *pHQVCtl |= HQV_YUV420; break; @@ -422,7 +421,6 @@ viaOverlayGetV1V3Format(VIAPtr pVia, int vport, /* 1 or 3, as in V1 or V3 */ } else { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: - case FOURCC_I420: case FOURCC_XVMC: if (vport == 1) { *pVidCtl |= V1_YCbCr420; @@ -505,7 +503,6 @@ viaOverlayGetSrcStartAddress(VIAPtr pVia, break; case FOURCC_YV12: - case FOURCC_I420: case FOURCC_XVMC: if (videoFlag & VIDEO_HQV_INUSE) @@ -766,7 +763,6 @@ viaOverlayGetFetch(VIAPtr pVia, unsigned long videoFlag, switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: - case FOURCC_I420: case FOURCC_XVMC: n = 0; /* 2^n = 1 byte per pixel (Y channel in planar YUV) */ break; @@ -1150,7 +1146,7 @@ AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc) !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; - isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_I420) || (fourcc == FOURCC_XVMC)); + isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_XVMC)); width = pVia->swov.SWDevice.gdwSWSrcWidth; height = pVia->swov.SWDevice.gdwSWSrcHeight; @@ -1193,7 +1189,6 @@ CreateSurface(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width, isplanar = FALSE; switch (FourCC) { case FOURCC_YV12: - case FOURCC_I420: case FOURCC_XVMC: isplanar = TRUE; pitch = ALIGN_TO(Width, 32); @@ -1286,10 +1281,9 @@ ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, break; case FOURCC_YV12: - case FOURCC_I420: retCode = CreateSurface(pScrn, FourCC, Width, Height, TRUE); if (retCode == Success) - retCode = AddHQVSurface(pScrn, numbuf, FourCC); + retCode = AddHQVSurface(pScrn, numbuf, FOURCC_YV12); break; case FOURCC_XVMC: @@ -1351,7 +1345,6 @@ ViaSwovSurfaceDestroy(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv) break; case FOURCC_YV12: - case FOURCC_I420: VIAFreeLinear(&pVia->swov.SWfbMem); case FOURCC_XVMC: pVia->swov.SrcFourCC = 0; @@ -1516,7 +1509,6 @@ SetupFIFOs(VIAPtr pVia, unsigned long videoFlag, { if (miniCtl & V1_Y_INTERPOLY) { if (pVia->swov.SrcFourCC == FOURCC_YV12 - || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) @@ -1550,7 +1542,6 @@ SetupFIFOs(VIAPtr pVia, unsigned long videoFlag, } } else { if (pVia->swov.SrcFourCC == FOURCC_YV12 - || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) @@ -1900,7 +1891,6 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag, pVia->swov.overlayRecordV1.dwOffset = dwOffset; if (pVia->swov.SrcFourCC == FOURCC_YV12 - || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { YCBCRREC YCbCr; @@ -1993,7 +1983,6 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag, SetHQVFetch(pVia, hqvSrcFetch, oriSrcHeight); if (pVia->swov.SrcFourCC == FOURCC_YV12 - || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_STRIDE, srcPitch << 1); @@ -2303,7 +2292,6 @@ VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY pUpdate) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || - (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { videoFlag = pVia->swov.gdwVideoFlagSW; } @@ -2378,7 +2366,6 @@ VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY pUpdate) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || - (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { pVia->swov.SWDevice.gdwSWDstLeft = pUpdate->DstLeft + panDX; pVia->swov.SWDevice.gdwSWDstTop = pUpdate->DstTop + panDY; @@ -2438,7 +2425,6 @@ ViaOverlayHide(ScrnInfoPtr pScrn) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || - (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) videoFlag = pVia->swov.gdwVideoFlagSW; diff --git a/src/via_video.c b/src/via_video.c index 1797cfd..58538d8 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -117,14 +117,10 @@ static int viaSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer); static int viaPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer, DrawablePtr); -static void nv12Blit(unsigned char *dst, - const unsigned char *src1, - const unsigned char *src2, - unsigned srcPitch, unsigned dstPitch, unsigned width, unsigned height); -static void UVBlit(unsigned char *dst, - const unsigned char *src1, - const unsigned char *src2, - unsigned srcPitch, unsigned dstPitch, unsigned width, unsigned height); +static void nv12Blit(unsigned char *nv12Chroma, + const unsigned char *uBuffer, + const unsigned char *vBuffer, + unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines); static Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation, xvAutoPaint; @@ -162,12 +158,11 @@ static XF86AttributeRec AttributesG[NUM_ATTRIBUTES_G] = { {XvSettable | XvGettable, 0, 1, "XV_AUTOPAINT_COLORKEY"} }; -#define NUM_IMAGES_G 7 +#define NUM_IMAGES_G 6 static XF86ImageRec ImagesG[NUM_IMAGES_G] = { XVIMAGE_YUY2, XVIMAGE_YV12, - XVIMAGE_I420, { /* * Below, a dummy picture type that is used in XvPutImage only to do @@ -968,7 +963,6 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, proReg) & ~HQV_FLIP_ODD) | HQV_SW_FLIP | HQV_FLIP_STATUS); break; case FOURCC_YV12: - case FOURCC_I420: default: while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP) && --count); @@ -990,7 +984,22 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, } } +/* + * Slow and dirty. NV12 blit. + */ +static void +nv12cp(unsigned char *dst, + const unsigned char *src, int dstPitch, int w, int h, int yuv422) +{ + /* + * Blit luma component as a fake YUY2 assembler blit. + */ + + (*viaFastVidCpy) (dst, src, dstPitch, w >> 1, h, TRUE); + nv12Blit(dst + dstPitch * h, src + w * h + (w >> 1) * (h >> 1), + src + w * h, w >> 1, w >> 1, dstPitch, h >> 1); +} #ifdef XF86DRI @@ -1014,7 +1023,7 @@ viaDmaBlitImage(VIAPtr pVia, bounceBuffer = ((unsigned long)src & 15); nv12Conversion = (pVia->VideoEngine == VIDEO_ENGINE_CME && - (id == FOURCC_YV12 || id == FOURCC_I420)); + id == FOURCC_YV12); switch (id) { case FOURCC_YUY2: @@ -1029,7 +1038,6 @@ viaDmaBlitImage(VIAPtr pVia, break; case FOURCC_YV12: - case FOURCC_I420: default: bounceStride = ALIGN_TO(width, 16); bounceLines = height; @@ -1045,9 +1053,8 @@ viaDmaBlitImage(VIAPtr pVia, pPort->dmaBounceBuffer = 0; } size = bounceStride * bounceLines + 16; - if (id == FOURCC_YV12 || id == FOURCC_I420) { + if (FOURCC_YV12 == id) size += ALIGN_TO(bounceStride >> 1, 16) * bounceLines; - } pPort->dmaBounceBuffer = (unsigned char *)malloc(size); pPort->dmaBounceLines = bounceLines; pPort->dmaBounceStride = bounceStride; @@ -1086,22 +1093,14 @@ viaDmaBlitImage(VIAPtr pVia, lumaSync = blit.sync; - if (id == FOURCC_YV12 || id == FOURCC_I420) { + if (id == FOURCC_YV12) { unsigned tmp = ALIGN_TO(width >> 1, 16); if (nv12Conversion) { - if (id == FOURCC_YV12) { - nv12Blit(bounceBase + bounceStride * height, - src + bounceStride * height + tmp * (height >> 1), - src + bounceStride * height, - tmp, bounceStride, width >> 1, height >> 1); - } else if (id == FOURCC_I420) { - /* TODO Check if this code will work properly with FOURCC_I420 */ - nv12Blit(bounceBase + bounceStride * height, - src + bounceStride * height, - src + bounceStride * height + tmp * (height >> 1), - tmp, bounceStride, width >> 1, height >> 1); - } + nv12Blit(bounceBase + bounceStride * height, + src + bounceStride * height + tmp * (height >> 1), + src + bounceStride * height, width >> 1, tmp, + bounceStride, height >> 1); } else if (bounceBuffer) { (*viaFastVidCpy) (base + bounceStride * height, src + bounceStride * height, tmp, tmp >> 1, height, 1); @@ -1228,45 +1227,13 @@ viaPutImage(ScrnInfoPtr pScrn, switch (id) { case FOURCC_YV12: if (pVia->VideoEngine == VIDEO_ENGINE_CME) { - int srcYSize = width * height; - /* Copy Y component */ - (*viaFastVidCpy) (pVia->swov.SWDevice. - lpSWOverlaySurface[pVia->dwFrameNum & 1], - buf, dstPitch, width >> 1, height, TRUE); - - /* Copy U and V component */ - nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch * height, - buf + srcYSize + (srcYSize >> 2), /* Size of UV component is 1/4 of Y */ - buf + srcYSize, - width >> 1, dstPitch, width >> 1, height >> 1); - } else { - (*viaFastVidCpy)(pVia->swov.SWDevice. + nv12cp(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); - } - break; - case FOURCC_I420: - if (pVia->VideoEngine == VIDEO_ENGINE_CME) { - int srcYSize = width * height; - - (*viaFastVidCpy) (pVia->swov.SWDevice. - lpSWOverlaySurface[pVia->dwFrameNum & 1], - buf, dstPitch, width >> 1, height, TRUE); - - nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch*height, - buf + srcYSize, - buf + srcYSize + (srcYSize >> 2), /* UV component is 1/4 of Y */ - width >> 1, dstPitch, width >> 1, height >> 1); } else { - int srcYSize = width * height; (*viaFastVidCpy)(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); - - nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch * height, - buf + srcYSize + (srcYSize >> 2), - buf + srcYSize, - width >> 1, dstPitch, width, height >> 1); } break; case FOURCC_RV32: commit ad324b42e98f88f1d20ac2b5a91778c96b032dbd Author: gang65 <gang65@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Sun May 8 14:20:15 2011 +0000 Fix cursor garbare after suspend/hibernate/resume on VX855/VX900 chipsets #405 git-svn-id: http://svn.openchrome.org/svn/trunk@922 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/src/via_swov.c b/src/via_swov.c index 1f9aff9..c2c7d6f 100644 --- a/src/via_swov.c +++ b/src/via_swov.c @@ -392,6 +392,7 @@ viaOverlayGetV1V3Format(VIAPtr pVia, int vport, /* 1 or 3, as in V1 or V3 */ if (videoFlag & VIDEO_HQV_INUSE) { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: + case FOURCC_I420: case FOURCC_XVMC: *pHQVCtl |= HQV_YUV420; break; @@ -421,6 +422,7 @@ viaOverlayGetV1V3Format(VIAPtr pVia, int vport, /* 1 or 3, as in V1 or V3 */ } else { switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: + case FOURCC_I420: case FOURCC_XVMC: if (vport == 1) { *pVidCtl |= V1_YCbCr420; @@ -503,6 +505,7 @@ viaOverlayGetSrcStartAddress(VIAPtr pVia, break; case FOURCC_YV12: + case FOURCC_I420: case FOURCC_XVMC: if (videoFlag & VIDEO_HQV_INUSE) @@ -763,6 +766,7 @@ viaOverlayGetFetch(VIAPtr pVia, unsigned long videoFlag, switch (pVia->swov.SrcFourCC) { case FOURCC_YV12: + case FOURCC_I420: case FOURCC_XVMC: n = 0; /* 2^n = 1 byte per pixel (Y channel in planar YUV) */ break; @@ -1146,7 +1150,7 @@ AddHQVSurface(ScrnInfoPtr pScrn, unsigned int numbuf, CARD32 fourcc) !(pVia->swov.gdwVideoFlagSW & VIDEO_1_INUSE)) proReg = PRO_HQV1_OFFSET; - isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_XVMC)); + isplanar = ((fourcc == FOURCC_YV12) || (fourcc == FOURCC_I420) || (fourcc == FOURCC_XVMC)); width = pVia->swov.SWDevice.gdwSWSrcWidth; height = pVia->swov.SWDevice.gdwSWSrcHeight; @@ -1189,6 +1193,7 @@ CreateSurface(ScrnInfoPtr pScrn, CARD32 FourCC, CARD16 Width, isplanar = FALSE; switch (FourCC) { case FOURCC_YV12: + case FOURCC_I420: case FOURCC_XVMC: isplanar = TRUE; pitch = ALIGN_TO(Width, 32); @@ -1281,9 +1286,10 @@ ViaSwovSurfaceCreate(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv, break; case FOURCC_YV12: + case FOURCC_I420: retCode = CreateSurface(pScrn, FourCC, Width, Height, TRUE); if (retCode == Success) - retCode = AddHQVSurface(pScrn, numbuf, FOURCC_YV12); + retCode = AddHQVSurface(pScrn, numbuf, FourCC); break; case FOURCC_XVMC: @@ -1345,6 +1351,7 @@ ViaSwovSurfaceDestroy(ScrnInfoPtr pScrn, viaPortPrivPtr pPriv) break; case FOURCC_YV12: + case FOURCC_I420: VIAFreeLinear(&pVia->swov.SWfbMem); case FOURCC_XVMC: pVia->swov.SrcFourCC = 0; @@ -1509,6 +1516,7 @@ SetupFIFOs(VIAPtr pVia, unsigned long videoFlag, { if (miniCtl & V1_Y_INTERPOLY) { if (pVia->swov.SrcFourCC == FOURCC_YV12 + || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) @@ -1542,6 +1550,7 @@ SetupFIFOs(VIAPtr pVia, unsigned long videoFlag, } } else { if (pVia->swov.SrcFourCC == FOURCC_YV12 + || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_HQV_INUSE) { if (videoFlag & VIDEO_1_INUSE) @@ -1891,6 +1900,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag, pVia->swov.overlayRecordV1.dwOffset = dwOffset; if (pVia->swov.SrcFourCC == FOURCC_YV12 + || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { YCBCRREC YCbCr; @@ -1983,6 +1993,7 @@ Upd_Video(ScrnInfoPtr pScrn, unsigned long videoFlag, SetHQVFetch(pVia, hqvSrcFetch, oriSrcHeight); if (pVia->swov.SrcFourCC == FOURCC_YV12 + || pVia->swov.SrcFourCC == FOURCC_I420 || pVia->swov.SrcFourCC == FOURCC_XVMC) { if (videoFlag & VIDEO_1_INUSE) SaveVideoRegister(pVia, V1_STRIDE, srcPitch << 1); @@ -2292,6 +2303,7 @@ VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY pUpdate) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || + (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { videoFlag = pVia->swov.gdwVideoFlagSW; } @@ -2366,6 +2378,7 @@ VIAVidUpdateOverlay(ScrnInfoPtr pScrn, LPDDUPDATEOVERLAY pUpdate) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || + (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) { pVia->swov.SWDevice.gdwSWDstLeft = pUpdate->DstLeft + panDX; pVia->swov.SWDevice.gdwSWDstTop = pUpdate->DstTop + panDY; @@ -2425,6 +2438,7 @@ ViaOverlayHide(ScrnInfoPtr pScrn) (pVia->swov.SrcFourCC == FOURCC_RV16) || (pVia->swov.SrcFourCC == FOURCC_RV32) || (pVia->swov.SrcFourCC == FOURCC_YV12) || + (pVia->swov.SrcFourCC == FOURCC_I420) || (pVia->swov.SrcFourCC == FOURCC_XVMC)) videoFlag = pVia->swov.gdwVideoFlagSW; diff --git a/src/via_video.c b/src/via_video.c index 58538d8..1797cfd 100644 --- a/src/via_video.c +++ b/src/via_video.c @@ -117,10 +117,14 @@ static int viaSetPortAttribute(ScrnInfoPtr, Atom, INT32, pointer); static int viaPutImage(ScrnInfoPtr, short, short, short, short, short, short, short, short, int, unsigned char *, short, short, Bool, RegionPtr, pointer, DrawablePtr); -static void nv12Blit(unsigned char *nv12Chroma, - const unsigned char *uBuffer, - const unsigned char *vBuffer, - unsigned width, unsigned srcPitch, unsigned dstPitch, unsigned lines); +static void nv12Blit(unsigned char *dst, + const unsigned char *src1, + const unsigned char *src2, + unsigned srcPitch, unsigned dstPitch, unsigned width, unsigned height); +static void UVBlit(unsigned char *dst, + const unsigned char *src1, + const unsigned char *src2, + unsigned srcPitch, unsigned dstPitch, unsigned width, unsigned height); static Atom xvBrightness, xvContrast, xvColorKey, xvHue, xvSaturation, xvAutoPaint; @@ -158,11 +162,12 @@ static XF86AttributeRec AttributesG[NUM_ATTRIBUTES_G] = { {XvSettable | XvGettable, 0, 1, "XV_AUTOPAINT_COLORKEY"} }; -#define NUM_IMAGES_G 6 +#define NUM_IMAGES_G 7 static XF86ImageRec ImagesG[NUM_IMAGES_G] = { XVIMAGE_YUY2, XVIMAGE_YV12, + XVIMAGE_I420, { /* * Below, a dummy picture type that is used in XvPutImage only to do @@ -963,6 +968,7 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, proReg) & ~HQV_FLIP_ODD) | HQV_SW_FLIP | HQV_FLIP_STATUS); break; case FOURCC_YV12: + case FOURCC_I420: default: while ((VIDInD(HQV_CONTROL + proReg) & HQV_SW_FLIP) && --count); @@ -984,22 +990,7 @@ Flip(VIAPtr pVia, viaPortPrivPtr pPriv, int fourcc, } } -/* - * Slow and dirty. NV12 blit. - */ -static void -nv12cp(unsigned char *dst, - const unsigned char *src, int dstPitch, int w, int h, int yuv422) -{ - /* - * Blit luma component as a fake YUY2 assembler blit. - */ - - (*viaFastVidCpy) (dst, src, dstPitch, w >> 1, h, TRUE); - nv12Blit(dst + dstPitch * h, src + w * h + (w >> 1) * (h >> 1), - src + w * h, w >> 1, w >> 1, dstPitch, h >> 1); -} #ifdef XF86DRI @@ -1023,7 +1014,7 @@ viaDmaBlitImage(VIAPtr pVia, bounceBuffer = ((unsigned long)src & 15); nv12Conversion = (pVia->VideoEngine == VIDEO_ENGINE_CME && - id == FOURCC_YV12); + (id == FOURCC_YV12 || id == FOURCC_I420)); switch (id) { case FOURCC_YUY2: @@ -1038,6 +1029,7 @@ viaDmaBlitImage(VIAPtr pVia, break; case FOURCC_YV12: + case FOURCC_I420: default: bounceStride = ALIGN_TO(width, 16); bounceLines = height; @@ -1053,8 +1045,9 @@ viaDmaBlitImage(VIAPtr pVia, pPort->dmaBounceBuffer = 0; } size = bounceStride * bounceLines + 16; - if (FOURCC_YV12 == id) + if (id == FOURCC_YV12 || id == FOURCC_I420) { size += ALIGN_TO(bounceStride >> 1, 16) * bounceLines; + } pPort->dmaBounceBuffer = (unsigned char *)malloc(size); pPort->dmaBounceLines = bounceLines; pPort->dmaBounceStride = bounceStride; @@ -1093,14 +1086,22 @@ viaDmaBlitImage(VIAPtr pVia, lumaSync = blit.sync; - if (id == FOURCC_YV12) { + if (id == FOURCC_YV12 || id == FOURCC_I420) { unsigned tmp = ALIGN_TO(width >> 1, 16); if (nv12Conversion) { - nv12Blit(bounceBase + bounceStride * height, - src + bounceStride * height + tmp * (height >> 1), - src + bounceStride * height, width >> 1, tmp, - bounceStride, height >> 1); + if (id == FOURCC_YV12) { + nv12Blit(bounceBase + bounceStride * height, + src + bounceStride * height + tmp * (height >> 1), + src + bounceStride * height, + tmp, bounceStride, width >> 1, height >> 1); + } else if (id == FOURCC_I420) { + /* TODO Check if this code will work properly with FOURCC_I420 */ + nv12Blit(bounceBase + bounceStride * height, + src + bounceStride * height, + src + bounceStride * height + tmp * (height >> 1), + tmp, bounceStride, width >> 1, height >> 1); + } } else if (bounceBuffer) { (*viaFastVidCpy) (base + bounceStride * height, src + bounceStride * height, tmp, tmp >> 1, height, 1); @@ -1227,13 +1228,45 @@ viaPutImage(ScrnInfoPtr pScrn, switch (id) { case FOURCC_YV12: if (pVia->VideoEngine == VIDEO_ENGINE_CME) { - nv12cp(pVia->swov.SWDevice. + int srcYSize = width * height; + /* Copy Y component */ + (*viaFastVidCpy) (pVia->swov.SWDevice. + lpSWOverlaySurface[pVia->dwFrameNum & 1], + buf, dstPitch, width >> 1, height, TRUE); + + /* Copy U and V component */ + nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch * height, + buf + srcYSize + (srcYSize >> 2), /* Size of UV component is 1/4 of Y */ + buf + srcYSize, + width >> 1, dstPitch, width >> 1, height >> 1); + } else { + (*viaFastVidCpy)(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); + } + break; + case FOURCC_I420: + if (pVia->VideoEngine == VIDEO_ENGINE_CME) { + int srcYSize = width * height; + + (*viaFastVidCpy) (pVia->swov.SWDevice. + lpSWOverlaySurface[pVia->dwFrameNum & 1], + buf, dstPitch, width >> 1, height, TRUE); + + nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch*height, + buf + srcYSize, + buf + srcYSize + (srcYSize >> 2), /* UV component is 1/4 of Y */ + width >> 1, dstPitch, width >> 1, height >> 1); } else { + int srcYSize = width * height; (*viaFastVidCpy)(pVia->swov.SWDevice. lpSWOverlaySurface[pVia->dwFrameNum & 1], buf, dstPitch, width, height, 0); + + nv12Blit(pVia->swov.SWDevice.lpSWOverlaySurface[pVia->dwFrameNum & 1] + dstPitch * height, + buf + srcYSize + (srcYSize >> 2), + buf + srcYSize, + width >> 1, dstPitch, width, height >> 1); } break; case FOURCC_RV32: commit a40b536f0fa3142fa9fcd02346ae1ea14352ab2d Author: gang65 <gang65@e8d65cb0-85f4-0310-8831-c60e2a5ce829> Date: Wed May 4 16:59:14 2011 +0000 Fix XAA displaying issues git-svn-id: http://svn.openchrome.org/svn/trunk@921 e8d65cb0-85f4-0310-8831-c60e2a5ce829 diff --git a/ChangeLog b/ChangeLog index 546cf09..2f3bb5c 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,3 +1,9 @@ +2011-05-04 Bartosz Kosiorek <gan...@poczta.onet.pl> + + Fix XAA displaying issues + + * src/via_accel.c: (viaInitXAA): + 2011-01-23 Bartosz Kosiorek <gan...@poczta.onet.pl> Enable hardware cursor for VX900 diff --git a/src/via_accel.c b/src/via_accel.c index c6252c2..df8cbc1 100644 --- a/src/via_accel.c +++ b/src/via_accel.c @@ -602,7 +602,7 @@ viaDisableClipping(ScrnInfoPtr pScrn) /* * This is a small helper to wrap around a PITCH register write - * to deal with the sublte differences of M1 and old 2D engine + * to deal with the subtle differences of M1 and old 2D engine */ static void viaPitchHelper(VIAPtr pVia, unsigned dstPitch, unsigned srcPitch) @@ -1252,7 +1252,9 @@ viaInitXAA(ScreenPtr pScreen) HARDWARE_CLIP_COLOR_8x8_FILL | HARDWARE_CLIP_SCREEN_TO_SCREEN_COLOR_EXPAND | 0); - if (pVia->Chipset != VIA_VX855 && pVia->Chipset != VIA_VX900) + if (pVia->Chipset != VIA_VX800 && + pVia->Chipset != VIA_VX855 && + pVia->Chipset != VIA_VX900) xaaptr->ClippingFlags |= (HARDWARE_CLIP_SOLID_FILL | HARDWARE_CLIP_SOLID_LINE | HARDWARE_CLIP_DASHED_LINE); -- To UNSUBSCRIBE, email to debian-x-requ...@lists.debian.org with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org Archive: http://lists.debian.org/e1rwg3w-0004xz...@vasks.debian.org