1/*
2	Copyright 1999, Be Incorporated.   All Rights Reserved.
3	This file may be used under the terms of the Be Sample Code License.
4
5	Other authors:
6	Rudolf Cornelissen 9/2003-2/2005.
7*/
8
9/*
10	note:
11	moved DMA acceleration 'top-level' routines to be integrated in the engine:
12	it is costly to call the engine for every single function within a loop!
13	(measured with BeRoMeter 1.2.6: upto 15% speed increase on all CPU's.)
14	Leaving PIO acceleration as it is for now, for the purpose of benchmarking :-)
15
16	note also:
17	attempting DMA on NV40 and higher because without it I can't get them going ATM.
18	Maybe later we can forget about PIO mode acceleration totally (depends on 3D
19	acceleration attempts).
20*/
21
22#define MODULE_BIT 0x40000000
23
24#include "acc_std.h"
25
26void SCREEN_TO_SCREEN_BLIT_PIO(engine_token *et, blit_params *list, uint32 count)
27{
28	int i;
29
30	/* init acc engine for blit function */
31	nv_acc_setup_blit();
32
33	/* do each blit */
34	i=0;
35	while (count--)
36	{
37		nv_acc_blit
38		(
39			list[i].src_left,
40			list[i].src_top,
41			list[i].dest_left,
42			list[i].dest_top,
43			list[i].width,
44			list[i].height
45		);
46		i++;
47	}
48}
49
50void SCREEN_TO_SCREEN_SCALED_FILTERED_BLIT_PIO(engine_token *et, scaled_blit_params *list, uint32 count)
51{
52	int i;
53
54	/* do each blit */
55	i=0;
56	while (count--)
57	{
58		nv_acc_video_blit
59		(
60			list[i].src_left,
61			list[i].src_top,
62			list[i].src_width,
63			list[i].src_height,
64			list[i].dest_left,
65			list[i].dest_top,
66			list[i].dest_width,
67			list[i].dest_height
68		);
69		i++;
70	}
71}
72
73void SCREEN_TO_SCREEN_TRANSPARENT_BLIT_PIO(engine_token *et, uint32 transparent_colour, blit_params *list, uint32 count)
74{
75	int i;
76
77	/* do each blit */
78	i=0;
79	while (count--)
80	{
81		nv_acc_transparent_blit
82		(
83			list[i].src_left,
84			list[i].src_top,
85			list[i].dest_left,
86			list[i].dest_top,
87			list[i].width,
88			list[i].height,
89			transparent_colour
90		);
91		i++;
92	}
93}
94
95void FILL_RECTANGLE_PIO(engine_token *et, uint32 colorIndex, fill_rect_params *list, uint32 count)
96{
97	int i;
98
99	/* init acc engine for fill function */
100	nv_acc_setup_rectangle(colorIndex);
101
102	/* draw each rectangle */
103	i=0;
104	while (count--)
105	{
106		nv_acc_rectangle
107		(
108			list[i].left,
109			(list[i].right)+1,
110			list[i].top,
111			(list[i].bottom-list[i].top)+1
112		);
113		i++;
114	}
115}
116
117void INVERT_RECTANGLE_PIO(engine_token *et, fill_rect_params *list, uint32 count)
118{
119	int i;
120
121	/* init acc engine for invert function */
122	nv_acc_setup_rect_invert();
123
124	/* invert each rectangle */
125	i=0;
126	while (count--)
127	{
128		nv_acc_rectangle_invert
129		(
130			list[i].left,
131			(list[i].right)+1,
132			list[i].top,
133			(list[i].bottom-list[i].top)+1
134		);
135		i++;
136	}
137}
138
139void FILL_SPAN_PIO(engine_token *et, uint32 colorIndex, uint16 *list, uint32 count)
140{
141	int i;
142
143	/* init acc engine for fill function */
144	nv_acc_setup_rectangle(colorIndex);
145
146	/* draw each span */
147	i=0;
148	while (count--)
149	{
150		nv_acc_rectangle
151		(
152			list[i+1],
153			list[i+2]+1,
154			list[i],
155			1
156		);
157		i+=3;
158	}
159}
160