Hi all,
The attaching file is the sis315 patch for the following issue:
1. XGI Z series chip support.
2. WORDS_BIGENDIAN support.
3. STRETCHBLIT support.
4. fix bitblt location problem.
If the patch format is not right, please let me know.
Thanks!
Yi-Lin

diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_accel.c
DirectFB.git1/gfxdrivers/sis315/sis315_accel.c
--- DirectFB.git/gfxdrivers/sis315/sis315_accel.c       2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_accel.c      2009-04-01
20:24:43.000000000 +0800
@@ -28,19 +28,34 @@
 #include "sis315.h"
 #include "sis315_mmio.h"
 #include "sis315_regs.h"
-#include "sis315_accel.h"
+
+dump_cmd(SiSDriverData *drv)
+{
+int i;
+fprintf(stderr,"MMIO8200--MMIO8240 \n");
+for( i = 0x8200 ; i < 0x8240 ; i+=0x10 )
+    {
+       fprintf(stderr,"[%04X]: %08lX %08lX %08lX %08lX\n",i,
+               (sis_rl(drv->mmio_base, i)),
+               (sis_rl(drv->mmio_base, i+4)),
+               (sis_rl(drv->mmio_base, i+8)),
+               (sis_rl(drv->mmio_base, i+12)));
+     }
+
+}
+
 
 static void sis_idle(SiSDriverData *drv)
 {
        while (!(sis_rl(drv->mmio_base, SIS315_2D_CMD_QUEUE_STATUS) &
0x80000000));
 }
 
-static void sis_cmd(SiSDriverData *drv, SiSDeviceData *dev, u8 pat, u8
src, u8 type, u8 rop)
+static void sis_cmd(SiSDriverData *drv, SiSDeviceData *dev, u8 pat, u8
src, u32 type, u8 rop)
 {
        sis_wl(drv->mmio_base, SIS315_2D_CMD, SIS315_2D_CMD_RECT_CLIP_EN
|
                                              dev->cmd_bpp | (rop << 8)
|
                                              pat | src | type);
-
+//        dump_cmd(drv);
        sis_wl(drv->mmio_base, SIS315_2D_FIRE_TRIGGER, 0);
 
        sis_idle(drv);
@@ -111,7 +126,7 @@
        SiSDeviceData *dev = (SiSDeviceData *)device_data;
 
        sis_wl(drv->mmio_base, SIS315_2D_SRC_Y, (rect->x << 16) |
rect->y);
-       sis_wl(drv->mmio_base, SIS315_2D_DST_Y, (dx << 16) | dy);
+       sis_wl(drv->mmio_base, SIS315_2D_DST_Y, (dx << 16) | (dy &
0xffff));
        sis_wl(drv->mmio_base, SIS315_2D_RECT_WIDTH, (rect->h << 16) |
rect->w);
 
        sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG,
@@ -122,3 +137,103 @@
        return true;
 }
 
+
+bool sis_stretchblit(void *driver_data, void *device_data, DFBRectangle
*sr, DFBRectangle *dr )
+{
+//fprintf(stderr,"sis_stretchblit\n");
+        SiSDriverData *drv = (SiSDriverData *)driver_data;
+        SiSDeviceData *dev = (SiSDeviceData *)device_data;
+
+        long        lDstWidth, lDstHeight, lSrcWidth, lSrcHeight;
+        long        lSmallWidth, lLargeWidth, lSmallHeight,
lLargeHeight;
+        long        lXInitErr, lYInitErr;
+        unsigned long  dst_offset, src_offset, src_pitch, dst_pitch,
src_colorkey;   
+        if((dr->w > 0xfff)|(dr->h > 0xfff))
+            return false;
+       
+        lSrcWidth  = sr->w;
+        lDstWidth  = dr->w;
+        lSrcHeight = sr->h;
+        lDstHeight = dr->h;
+        
+        if(lDstWidth > lSrcWidth)
+        {
+            lLargeWidth = lDstWidth;
+            lSmallWidth = lSrcWidth;
+            lXInitErr   = 3 * lSrcWidth - 2 * lDstWidth;
+        }
+        else
+        {
+            lLargeWidth = lSrcWidth;
+            lSmallWidth = lDstWidth;
+            lXInitErr   = lDstWidth;     //HW design
+        }
+        
+        if(lDstHeight > lSrcHeight)
+        {
+            lLargeHeight = lDstHeight;
+            lSmallHeight = lSrcHeight;
+            lYInitErr    = 3 * lSrcHeight - 2 * lDstHeight;
+        }
+        else
+        {
+            lLargeHeight = lSrcHeight;
+            lSmallHeight = lDstHeight;
+            lYInitErr    = lDstHeight;   //HW design
+        }
+        
+       src_colorkey = sis_rl(drv->mmio_base,
SIS315_2D_TRANS_SRC_KEY_HIGH);
+
+        sis_wl(drv->mmio_base, 0x8208, (sr->x << 16) | sr->y & 0xFFFF);
+       sis_wl(drv->mmio_base, 0x820C, ( dr->x << 16) | dr->y & 0xFFFF);
+
+       sis_wl(drv->mmio_base, 0x8218, (dr->h << 16) | dr->w & 0x0FFF);
+       sis_wl(drv->mmio_base, 0x821c, (sr->h << 16) | sr->w & 0x0FFF);

+
+        sis_wl(drv->mmio_base, 0x8220, ((((lSmallWidth - lLargeWidth) *
2) << 16 ) | ((lSmallWidth * 2) & 0xFFFF)));
+        sis_wl(drv->mmio_base, 0x8224, ((((lSmallHeight - lLargeHeight)
* 2) << 16 ) | ((lSmallHeight * 2) & 0xFFFF)));                   
+        sis_wl(drv->mmio_base, 0x8228, ((lYInitErr << 16) | (lXInitErr
& 0xFFFF)));
+
+    if(dev->blit_rop == SIS315_ROP_AND_INVERTED_PAT)
/*DSBLIT_SRC_COLORKEY*/
+    {
+        dst_offset = sis_rl(drv->mmio_base, SIS315_2D_DST_ADDR);
+        src_offset = sis_rl(drv->mmio_base, SIS315_2D_SRC_ADDR);
+        src_pitch  = sis_rl(drv->mmio_base, 0x8204);
+        dst_pitch  = sis_rl(drv->mmio_base, 0x8214);
+
+//drv->buffer_offset resverve 1024x768x4 at driver_init_driver() in
sis315.c
+        sis_wl(drv->mmio_base, SIS315_2D_DST_ADDR, drv->buffer_offset);
+        sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG,
+                         SIS315_2D_CMD_SRC_VIDEO,
+                         dev->blit_cmd,
+                         SIS315_ROP_COPY);
+
+        sis_wl(drv->mmio_base, SIS315_2D_SRC_ADDR, drv->buffer_offset);
+        sis_wl(drv->mmio_base, SIS315_2D_DST_ADDR, dst_offset);      
+           sis_wl(drv->mmio_base, 0x8204, dst_pitch);      
+        sis_wl(drv->mmio_base, SIS315_2D_SRC_Y, (dr->x << 16) | dr->y);
+           sis_wl(drv->mmio_base, SIS315_2D_DST_Y, (dr->x << 16) |
(dr->y & 0xffff));
+           sis_wl(drv->mmio_base, SIS315_2D_RECT_WIDTH, (dr->h << 16) |
dr->w);
+  
+        sis_wl(drv->mmio_base, SIS315_2D_TRANS_SRC_KEY_HIGH,
src_colorkey);
+        sis_wl(drv->mmio_base, SIS315_2D_TRANS_SRC_KEY_LOW,
src_colorkey);
+    
+        sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG,
+                         SIS315_2D_CMD_SRC_VIDEO,
+        SIS315_2D_CMD_TRANSPARENT_BITBLT,
+                         dev->blit_rop);
+        
+        sis_wl(drv->mmio_base, SIS315_2D_SRC_ADDR, src_offset);
/*restore*/
+        sis_wl(drv->mmio_base, 0x8204, src_pitch);         
+    }  
+    else /*simple stretch bitblt */
+    {
+       //fprintf(stderr,"dev->blit_cmd = %x \n",dev->blit_cmd);
+       sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG,
+                         SIS315_2D_CMD_SRC_VIDEO,
+                         dev->blit_cmd,
+                         dev->blit_rop);
+    }  
+    return true;
+}
+
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_accel.h
DirectFB.git1/gfxdrivers/sis315/sis315_accel.h
--- DirectFB.git/gfxdrivers/sis315/sis315_accel.h       2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_accel.h      2009-04-01
20:24:44.000000000 +0800
@@ -27,5 +27,5 @@
 bool sis_draw_rectangle(void *driver_data, void *device_data,
DFBRectangle *rect);
 bool sis_draw_line(void *driver_data, void *device_data, DFBRegion
*line);
 bool sis_blit(void *driver_data, void *device_data, DFBRectangle *rect,
int dx, int dy);
-
+bool sis_stretchblit(void *driver_data, void *device_data, DFBRectangle
*sr, DFBRectangle *dr );
 #endif /* _SIS315_ACCEL_H */
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315.c
DirectFB.git1/gfxdrivers/sis315/sis315.c
--- DirectFB.git/gfxdrivers/sis315/sis315.c     2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315.c    2009-04-01
20:24:43.000000000 +0800
@@ -51,7 +51,7 @@
 #define SIS_SUPPORTED_DRAWING_FLAGS            \
        (DSDRAW_NOFX)
 #define SIS_SUPPORTED_BLITTING_FUNCTIONS       \
-       (DFXL_BLIT)
+       (DFXL_BLIT | DFXL_STRETCHBLIT)
 #define SIS_SUPPORTED_BLITTING_FLAGS           \
        (DSBLIT_SRC_COLORKEY)
 
@@ -101,7 +101,10 @@
 
                switch (state->source->config.format) {
                case DSPF_LUT8:
+           case DSPF_ARGB1555:
                case DSPF_RGB16:
+        case DSPF_RGB32:
+        case DSPF_ARGB:
                        break;
                default:
                        return;
@@ -157,12 +160,23 @@
                sis_set_blittingflags(dev, state);
                state->set = SIS_SUPPORTED_BLITTING_FUNCTIONS;
                break;
+  case DFXL_STRETCHBLIT:
+    sis_validate_src(drv, dev, state);
+    sis_validate_dst(drv, dev, state);
+    if (state->blittingflags & DSBLIT_DST_COLORKEY)
+                       sis_set_dst_colorkey(drv, dev, state);
+    if (state->blittingflags & DSBLIT_SRC_COLORKEY)
+                       sis_set_src_colorkey(drv, dev, state);
+    sis_set_stretchblittingflags(dev, state);
+    state->set = DFXL_STRETCHBLIT;
+    break;
+
        default:
                D_BUG("unexpected drawing or blitting function");
                break;
        }
 
-       if (state->mod_hw & SMF_CLIP)
+       if (state->mod_hw & SMF_CLIP &&(accel!=DFXL_STRETCHBLIT))
                sis_set_clip(drv, &state->clip);
 
        state->mod_hw = 0;
@@ -193,6 +207,7 @@
        switch (dfb_gfxcard_get_accelerator(device)) {
        case FB_ACCEL_SIS_GLAMOUR_2:
        case FB_ACCEL_SIS_XABRE:
+    case FB_ACCEL_XGI_VOLARI_Z:
                return 1;
        default:
                return 0;
@@ -255,11 +270,6 @@
                return DFB_IO;
        }
 
-       if (fbinfo->sisfb_id != SISFB_ID) {
-               D_FREE(fbinfo);
-               return DFB_FAILURE;
-       }
-
        check_sisfb_version(drv, fbinfo);
 
        D_FREE(fbinfo);
@@ -288,7 +298,8 @@
 
        /* blitting functions */
        funcs->Blit = sis_blit;
-
+    funcs->StretchBlit = sis_stretchblit;
+    drv->buffer_offset = dfb_gfxcard_reserve_memory( device,
1024*768*4); /*allocate buffer for stretchBlit with colorkey*/
        return DFB_OK;
 }
 
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_compat.h
DirectFB.git1/gfxdrivers/sis315/sis315_compat.h
--- DirectFB.git/gfxdrivers/sis315/sis315_compat.h      2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_compat.h     2009-04-01
20:24:44.000000000 +0800
@@ -11,6 +11,9 @@
 #ifndef FB_ACCEL_SIS_XABRE
 #define FB_ACCEL_SIS_XABRE      41     /* SiS 330 ("Xabre")
*/
 #endif
+#ifndef FB_ACCEL_XGI_VOLARI_Z
+#define FB_ACCEL_XGI_VOLARI_Z      48     /* Z7 Z9           */
+#endif
 
 
 struct sisfb_info {
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315.h
DirectFB.git1/gfxdrivers/sis315/sis315.h
--- DirectFB.git/gfxdrivers/sis315/sis315.h     2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315.h    2009-04-01
20:24:43.000000000 +0800
@@ -33,6 +33,7 @@
        int get_info;
        int get_automaximize;
        int set_automaximize;
+    unsigned long buffer_offset;
 } SiSDriverData;
 
 typedef struct {
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_mmio.c
DirectFB.git1/gfxdrivers/sis315/sis315_mmio.c
--- DirectFB.git/gfxdrivers/sis315/sis315_mmio.c        2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_mmio.c       2009-04-01
20:24:44.000000000 +0800
@@ -31,11 +31,21 @@
 
 u32 sis_rl(volatile u8 *mmio, unsigned int offset)
 {
+#ifdef WORDS_BIGENDIAN
+    return BSWAP32(*(volatile u32 *)(mmio + offset));
+#else
        return *(volatile u32 *)(mmio + offset);
+#endif
+
 }
 
 void sis_wl(volatile u8 *mmio, unsigned int offset, u32 value)
 {
+
+#ifdef WORDS_BIGENDIAN
+       *(volatile u32 *)(mmio + offset) = BSWAP32(value);
+#else
        *(volatile u32 *)(mmio + offset) = value;
+#endif
 }
 
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_regs.h
DirectFB.git1/gfxdrivers/sis315/sis315_regs.h
--- DirectFB.git/gfxdrivers/sis315/sis315_regs.h        2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_regs.h       2009-04-01
20:24:44.000000000 +0800
@@ -65,6 +65,12 @@
        SIS315_2D_PATTERN_REG  = 0x8300
 };
 
+enum SIS315_2d_registers_StretchBlt {
+       SIS315_2D_X_ERROR_TERM = 0x8220,
+       SIS315_2D_Y_ERROR_TERM = 0x8224,
+       SIS315_2D_X_INITIAL_ERROR = 0x8228
+};
+
 enum sis315_2d_registers_drawline {
        SIS315_2D_LINE_X0      = 0x8208, SIS315_2D_LINE_Y0           =
0x820A,
        SIS315_2D_LINE_X1      = 0x820C, SIS315_2D_LINE_Y1           =
0x820E,
@@ -128,6 +134,17 @@
        /* destination */
        SIS315_DST_VIDEO                = 0x00000000,
        SIS315_DST_AGP                  = 0x02000000,
+
+       /*for Bltstretch*/
+       SIS_2D_CMD_SRC_Y_DEC          = 0x00000000,
+       SIS_2D_CMD_SRC_Y_INC          = 0x00400000,
+       SIS_2D_CMD_SRC_X_DEC          = 0x00000000,
+       SIS_2D_CMD_SRC_X_INC          = 0x00200000,
+       SIS_2D_CMD_DST_Y_DEC          = 0x00000000,
+       SIS_2D_CMD_DST_Y_INC          = 0x00100000,
+       SIS_2D_CMD_DST_X_DEC          = 0x00000000,
+       SIS_2D_CMD_DST_X_INC          = 0x00080000,
+
 #if 0
        SIS315_2D_CMD_DIR_X_INC         = 0x00010000,
        SIS315_2D_CMD_DIR_X_DEC         = 0x00000000,
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_state.c
DirectFB.git1/gfxdrivers/sis315/sis315_state.c
--- DirectFB.git/gfxdrivers/sis315/sis315_state.c       2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_state.c      2009-04-01
20:24:45.000000000 +0800
@@ -175,4 +175,19 @@
        sis_wl(drv->mmio_base, SIS315_2D_LEFT_CLIP, (clip->y1 << 16) |
clip->x1);
        sis_wl(drv->mmio_base, SIS315_2D_RIGHT_CLIP, (clip->y2 << 16) |
clip->x2);
 }
+void sis_set_stretchblittingflags(SiSDeviceData *dev, CardState *state)
+{
+       if (dev->v_blittingflags)
+               return;
+
+       dev->blit_cmd = SIS_2D_CMD_DST_Y_INC | SIS_2D_CMD_SRC_X_INC \
+               | SIS_2D_CMD_SRC_Y_INC | SIS_2D_CMD_DST_X_INC |
SIS315_2D_CMD_STRETCH_BITBLT;
+        
+        if (state->blittingflags & DSBLIT_SRC_COLORKEY) 
+           dev->blit_rop = SIS315_ROP_AND_INVERTED_PAT;
+       else 
+           dev->blit_rop = SIS315_ROP_COPY;
+
+       dev->v_blittingflags = 1;
+}
 
diff -Nur DirectFB.git/gfxdrivers/sis315/sis315_state.h
DirectFB.git1/gfxdrivers/sis315/sis315_state.h
--- DirectFB.git/gfxdrivers/sis315/sis315_state.h       2009-03-31
02:22:53.000000000 +0800
+++ DirectFB.git1/gfxdrivers/sis315/sis315_state.h      2009-04-01
20:24:45.000000000 +0800
@@ -30,5 +30,6 @@
 void sis_set_src_colorkey(SiSDriverData *drv, SiSDeviceData *dev,
CardState *state);
 void sis_set_blittingflags(SiSDeviceData *dev, CardState *state);
 void sis_set_clip(SiSDriverData *drv, DFBRegion *clip);
+void sis_set_stretchblittingflags(SiSDeviceData *dev, CardState
*state);
 
 #endif /* _SIS315_STATE_H */

_______________________________________________
directfb-dev mailing list
directfb-dev@directfb.org
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev

Reply via email to