void sis_set_dst_colorkey(SiSDriverData *drv, SiSDeviceData *dev, CardState *state) { if (dev->v_dst_colorkey) return; sis_wl(drv->mmio_base, SIS315_2D_TRANS_DEST_KEY_HIGH, state->dst_colorkey); sis_wl(drv->mmio_base, SIS315_2D_TRANS_DEST_KEY_LOW, state->dst_colorkey); dev->v_dst_colorkey = 1; }
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); sis_wl(drv->mmio_base, SIS315_2D_FIRE_TRIGGER, 0); /* dump_cmd(drv); */ sis_idle(drv); }
void sis_validate_src(SiSDriverData *drv, SiSDeviceData *dev, CardState *state) { CoreSurface *src = state->source; if (dev->v_source) return; sis_wl(drv->mmio_base, SIS315_2D_SRC_ADDR, state->src.offset); sis_wl(drv->mmio_base, SIS315_2D_SRC_PITCH, (dspfToSrcColor(src->config.format) << 16) | state->src.pitch); dev->v_source = 1; }
void sis_validate_dst(SiSDriverData *drv, SiSDeviceData *dev, CardState *state) { CoreSurface *dst = state->destination; if (dev->v_destination) return; dev->cmd_bpp = dspfToCmdBpp(dst->config.format); sis_wl(drv->mmio_base, SIS315_2D_DST_ADDR, state->dst.offset); sis_wl(drv->mmio_base, SIS315_2D_DST_PITCH, (0xffff << 16) | state->dst.pitch); dev->v_destination = 1; }
bool sis_fill_rectangle(void *driver_data, void *device_data, DFBRectangle *rect) { SiSDriverData *drv = (SiSDriverData *)driver_data; SiSDeviceData *dev = (SiSDeviceData *)device_data; sis_wl(drv->mmio_base, SIS315_2D_DST_Y, (rect->x << 16) | rect->y); sis_wl(drv->mmio_base, SIS315_2D_RECT_WIDTH, (rect->h << 16) | rect->w); sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG, SIS315_2D_CMD_SRC_VIDEO, SIS315_2D_CMD_BITBLT, SIS315_ROP_COPY_PAT); return true; }
bool sis_draw_line(void *driver_data, void *device_data, DFBRegion *line) { SiSDriverData *drv = (SiSDriverData *)driver_data; SiSDeviceData *dev = (SiSDeviceData *)device_data; sis_wl(drv->mmio_base, SIS315_2D_LINE_X0, (line->y1 << 16) | line->x1); sis_wl(drv->mmio_base, SIS315_2D_LINE_X1, (line->y2 << 16) | line->x2); sis_wl(drv->mmio_base, SIS315_2D_LINE_COUNT, 1); sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG, SIS315_2D_CMD_SRC_VIDEO, SIS315_2D_CMD_LINE_DRAW, SIS315_ROP_COPY_PAT); return true; }
bool sis_draw_rectangle(void *driver_data, void *device_data, DFBRectangle *rect) { SiSDriverData *drv = (SiSDriverData *)driver_data; SiSDeviceData *dev = (SiSDeviceData *)device_data; /* from top left ... */ sis_wl(drv->mmio_base, SIS315_2D_LINE_X0, (rect->y << 16) | rect->x); /* ... to top right ... */ sis_wl(drv->mmio_base, SIS315_2D_LINE_X1, (rect->y << 16) | (rect->x + rect->w - 1)); /* ... to bottom right ... */ sis_wl(drv->mmio_base, SIS315_2D_LINE_X(2), ((rect->y + rect->h - 1) << 16) | (rect->x + rect->w - 1)); /* ... to bottom left ... */ sis_wl(drv->mmio_base, SIS315_2D_LINE_X(3), ((rect->y + rect->h - 1) << 16) | rect->x); /* ... and back to top left */ sis_wl(drv->mmio_base, SIS315_2D_LINE_X(4), ((rect->y + 1) << 16) | rect->x); sis_wl(drv->mmio_base, SIS315_2D_LINE_COUNT, 4); sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG, SIS315_2D_CMD_SRC_VIDEO, SIS315_2D_CMD_LINE_DRAW, SIS315_ROP_COPY_PAT); return true; }
bool sis_blit(void *driver_data, void *device_data, DFBRectangle *rect, int dx, int dy) { SiSDriverData *drv = (SiSDriverData *)driver_data; 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 & 0xffff) ); sis_wl(drv->mmio_base, SIS315_2D_RECT_WIDTH, (rect->h << 16) | rect->w); if (dev->v_src_colorkey) { sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG, SIS315_2D_CMD_SRC_VIDEO, SIS315_2D_CMD_TRANSPARENT_BITBLT, SIS315_ROP_AND_INVERTED_PAT); } else { sis_cmd(drv, dev, SIS315_2D_CMD_PAT_FG_REG, SIS315_2D_CMD_SRC_VIDEO, SIS315_2D_CMD_BITBLT, SIS315_ROP_COPY); } return true; }
void sis_validate_color(SiSDriverData *drv, SiSDeviceData *dev, CardState *state) { u32 color; if (dev->v_color) return; switch (state->destination->config.format) { case DSPF_LUT8: color = state->color_index; break; case DSPF_ARGB1555: color = PIXEL_ARGB1555(state->color.a, state->color.r, state->color.g, state->color.b); break; case DSPF_RGB16: color = PIXEL_RGB16(state->color.r, state->color.g, state->color.b); break; case DSPF_RGB32: color = PIXEL_RGB32(state->color.r, state->color.g, state->color.b); break; case DSPF_ARGB: color = PIXEL_ARGB(state->color.a, state->color.r, state->color.g, state->color.b); break; default: D_BUG("unexpected pixelformat"); return; } sis_wl(drv->mmio_base, SIS315_2D_PAT_FG_COLOR, color); dev->v_color = 1; }
bool sis_stretchblit(void *driver_data, void *device_data, DFBRectangle *sr, DFBRectangle *dr ) { 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))); 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(dev->v_src_colorkey) /* 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 reserve 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, SIS315_ROP_AND_INVERTED_PAT); 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, SIS315_ROP_COPY); } return true; }
void sis_set_clip(SiSDriverData *drv, DFBRegion *clip) { 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); }