2 * linux/drivers/video/savage/savage_accel.c -- Hardware Acceleration
4 * Copyright (C) 2004 Antonino Daplas<adaplas@pol.net>
7 * This file is subject to the terms and conditions of the GNU General Public
8 * License. See the file COPYING in the main directory of this archive for
11 #include <linux/kernel.h>
12 #include <linux/string.h>
17 static u32 savagefb_rop
[] = {
22 int savagefb_sync(struct fb_info
*info
)
24 struct savagefb_par
*par
= info
->par
;
26 par
->SavageWaitIdle(par
);
30 void savagefb_copyarea(struct fb_info
*info
, const struct fb_copyarea
*region
)
32 struct savagefb_par
*par
= info
->par
;
33 int sx
= region
->sx
, dx
= region
->dx
;
34 int sy
= region
->sy
, dy
= region
->dy
;
37 if (!region
->width
|| !region
->height
)
40 cmd
= BCI_CMD_RECT
| BCI_CMD_DEST_GBD
| BCI_CMD_SRC_GBD
;
41 BCI_CMD_SET_ROP(cmd
, savagefb_rop
[0]);
44 cmd
|= BCI_CMD_RECT_XP
;
46 sx
+= region
->width
- 1;
47 dx
+= region
->width
- 1;
51 cmd
|= BCI_CMD_RECT_YP
;
53 sy
+= region
->height
- 1;
54 dy
+= region
->height
- 1;
57 par
->SavageWaitFifo(par
,4);
59 BCI_SEND(BCI_X_Y(sx
, sy
));
60 BCI_SEND(BCI_X_Y(dx
, dy
));
61 BCI_SEND(BCI_W_H(region
->width
, region
->height
));
64 void savagefb_fillrect(struct fb_info
*info
, const struct fb_fillrect
*rect
)
66 struct savagefb_par
*par
= info
->par
;
69 if (!rect
->width
|| !rect
->height
)
72 if (info
->fix
.visual
== FB_VISUAL_PSEUDOCOLOR
)
75 color
= ((u32
*)info
->pseudo_palette
)[rect
->color
];
77 cmd
= BCI_CMD_RECT
| BCI_CMD_RECT_XP
| BCI_CMD_RECT_YP
|
78 BCI_CMD_DEST_GBD
| BCI_CMD_SRC_SOLID
|
82 BCI_CMD_SET_ROP(cmd
, savagefb_rop
[rect
->rop
]);
84 par
->SavageWaitFifo(par
,4);
87 BCI_SEND( BCI_X_Y(rect
->dx
, rect
->dy
) );
88 BCI_SEND( BCI_W_H(rect
->width
, rect
->height
) );
91 void savagefb_imageblit(struct fb_info
*info
, const struct fb_image
*image
)
93 struct savagefb_par
*par
= info
->par
;
94 int fg
, bg
, size
, i
, width
;
96 u32
*src
= (u32
*) image
->data
;
98 if (!image
->width
|| !image
->height
)
101 if (image
->depth
!= 1) {
102 cfb_imageblit(info
, image
);
106 if (info
->fix
.visual
== FB_VISUAL_PSEUDOCOLOR
) {
107 fg
= image
->fg_color
;
108 bg
= image
->bg_color
;
110 fg
= ((u32
*)info
->pseudo_palette
)[image
->fg_color
];
111 bg
= ((u32
*)info
->pseudo_palette
)[image
->bg_color
];
114 cmd
= BCI_CMD_RECT
| BCI_CMD_RECT_XP
| BCI_CMD_RECT_YP
|
115 BCI_CMD_CLIP_LR
| BCI_CMD_DEST_GBD
| BCI_CMD_SRC_MONO
|
119 BCI_CMD_SET_ROP(cmd
, savagefb_rop
[0]);
121 width
= (image
->width
+ 31) & ~31;
122 size
= (width
* image
->height
)/8;
125 par
->SavageWaitFifo(par
, size
+ 5);
127 BCI_SEND(BCI_CLIP_LR(image
->dx
, image
->dx
+ image
->width
- 1));
130 BCI_SEND(BCI_X_Y(image
->dx
, image
->dy
));
131 BCI_SEND(BCI_W_H(width
, image
->height
));
132 for (i
= 0; i
< size
; i
++)
136 MODULE_LICENSE("GPL");