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
[email protected]
http://mail.directfb.org/cgi-bin/mailman/listinfo/directfb-dev