[Date Prev][Date Next] [Thread Prev][Thread Next] [Date Index] [Thread Index]

xserver-xorg-video-openchrome: Changes to 'upstream-unstable'



 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  <gang65@poczta.onet.pl>
+
+	Workaround EXA crash with new libcairo2 (#298)
+
+	* src/via_accel.c: (viaExaPrepareComposite):
+
 2011-05-08  Bartosz Kosiorek  <gang65@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  <gang65@poczta.onet.pl>
+
+	Fix cursor garbage after suspend/resume for Xserver 1.10 (#405)
+
+	* src/via_video.c: (viaRestoreVideo):
+
 2011-05-04  Bartosz Kosiorek  <gang65@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  <gang65@poczta.onet.pl>
+
+	Fix XAA displaying issues
+
+	* src/via_accel.c: (viaInitXAA):
+
 2011-01-23  Bartosz Kosiorek  <gang65@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);


Reply to: