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