brintos

brintos / linux-shallow public Read only

0
0
Text · 3.2 KiB · bfefa62 Raw
138 lines · c
1/*-*- linux-c -*-2 *  linux/drivers/video/savage/savage_accel.c -- Hardware Acceleration3 *4 *      Copyright (C) 2004 Antonino Daplas<adaplas@pol.net>5 *      All Rights Reserved6 *7 *  This file is subject to the terms and conditions of the GNU General Public8 *  License. See the file COPYING in the main directory of this archive for9 *  more details.10 */11#include <linux/kernel.h>12#include <linux/string.h>13#include <linux/fb.h>14#include <linux/module.h>15 16#include "savagefb.h"17 18static u32 savagefb_rop[] = {19	0xCC, /* ROP_COPY */20	0x5A  /* ROP_XOR  */21};22 23int savagefb_sync(struct fb_info *info)24{25	struct savagefb_par *par = info->par;26 27	par->SavageWaitIdle(par);28	return 0;29}30 31void savagefb_copyarea(struct fb_info *info, const struct fb_copyarea *region)32{33	struct savagefb_par *par = info->par;34	int sx = region->sx, dx = region->dx;35	int sy = region->sy, dy = region->dy;36	int cmd;37 38	if (!region->width || !region->height)39		return;40	par->bci_ptr = 0;41	cmd = BCI_CMD_RECT | BCI_CMD_DEST_GBD | BCI_CMD_SRC_GBD;42	BCI_CMD_SET_ROP(cmd, savagefb_rop[0]);43 44	if (dx <= sx) {45		cmd |= BCI_CMD_RECT_XP;46	} else {47		sx += region->width - 1;48		dx += region->width - 1;49	}50 51	if (dy <= sy) {52		cmd |= BCI_CMD_RECT_YP;53	} else {54		sy += region->height - 1;55		dy += region->height - 1;56	}57 58	par->SavageWaitFifo(par,4);59	BCI_SEND(cmd);60	BCI_SEND(BCI_X_Y(sx, sy));61	BCI_SEND(BCI_X_Y(dx, dy));62	BCI_SEND(BCI_W_H(region->width, region->height));63}64 65void savagefb_fillrect(struct fb_info *info, const struct fb_fillrect *rect)66{67	struct savagefb_par *par = info->par;68	int cmd, color;69 70	if (!rect->width || !rect->height)71		return;72 73	if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR)74		color = rect->color;75	else76		color = ((u32 *)info->pseudo_palette)[rect->color];77 78	cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |79	      BCI_CMD_DEST_GBD | BCI_CMD_SRC_SOLID |80	      BCI_CMD_SEND_COLOR;81 82	par->bci_ptr = 0;83	BCI_CMD_SET_ROP(cmd, savagefb_rop[rect->rop]);84 85	par->SavageWaitFifo(par,4);86	BCI_SEND(cmd);87	BCI_SEND(color);88	BCI_SEND( BCI_X_Y(rect->dx, rect->dy) );89	BCI_SEND( BCI_W_H(rect->width, rect->height) );90}91 92void savagefb_imageblit(struct fb_info *info, const struct fb_image *image)93{94	struct savagefb_par *par = info->par;95	int fg, bg, size, i, width;96	int cmd;97	u32 *src = (u32 *) image->data;98 99	if (!image->width || !image->height)100		return;101 102	if (image->depth != 1) {103		cfb_imageblit(info, image);104		return;105	}106 107	if (info->fix.visual == FB_VISUAL_PSEUDOCOLOR) {108		fg = image->fg_color;109		bg = image->bg_color;110	} else {111		fg = ((u32 *)info->pseudo_palette)[image->fg_color];112		bg = ((u32 *)info->pseudo_palette)[image->bg_color];113	}114 115	cmd = BCI_CMD_RECT | BCI_CMD_RECT_XP | BCI_CMD_RECT_YP |116	      BCI_CMD_CLIP_LR | BCI_CMD_DEST_GBD | BCI_CMD_SRC_MONO |117	      BCI_CMD_SEND_COLOR;118 119	par->bci_ptr = 0;120	BCI_CMD_SET_ROP(cmd, savagefb_rop[0]);121 122	width = (image->width + 31) & ~31;123	size = (width * image->height)/8;124	size >>= 2;125 126	par->SavageWaitFifo(par, size + 5);127	BCI_SEND(cmd);128	BCI_SEND(BCI_CLIP_LR(image->dx, image->dx + image->width - 1));129	BCI_SEND(fg);130	BCI_SEND(bg);131	BCI_SEND(BCI_X_Y(image->dx, image->dy));132	BCI_SEND(BCI_W_H(width, image->height));133	for (i = 0; i < size; i++)134		BCI_SEND(src[i]);135}136 137MODULE_LICENSE("GPL");138