Exemplo n.º 1
0
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;
}
Exemplo n.º 2
0
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);
}
Exemplo n.º 3
0
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;
}
Exemplo n.º 4
0
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;
}
Exemplo n.º 5
0
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;
}
Exemplo n.º 6
0
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;
}
Exemplo n.º 7
0
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;
}
Exemplo n.º 8
0
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;
}
Exemplo n.º 9
0
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;
}
Exemplo n.º 10
0
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;
}
Exemplo n.º 11
0
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);
}