1 /* Written by Michael Weller and Harm Hanemaayer. */
2 
3 
4 #include <stdarg.h>
5 #include "vga.h"
6 #include "driver.h"
7 #include "timing.h"
8 #include "accel.h"
9 
10 
11 /*
12  * This calls one of the acceleration interface functions.
13  */
14 
vga_accel(unsigned operation,...)15 int vga_accel(unsigned operation,...)
16 {
17     va_list params;
18 
19     va_start(params, operation);
20     /* This is the fast interface which I thought of first: */
21     if (__svgalib_driverspecs->accel) {
22 	int retval;
23 
24 	retval = (*(__svgalib_driverspecs->accel))(operation, params);
25 	va_end(params);
26 	return retval;
27     }
28 
29     /* Do a quick availability check to avoid disasters. */
30     if (__svgalib_driverspecs->accelspecs == 0)
31 	return -1;
32     /* Check for operation availability flag. */
33     if (!(__svgalib_driverspecs->accelspecs->operations & (1 << (operation - 1))))
34 	return -1;
35 
36     vga_lockvc();
37 
38     /*
39      * gcc doesn't produce glorious code here, it's much better with
40      * only one va_arg traversal in a function.
41      */
42 
43     switch (operation) {
44     case ACCEL_FILLBOX:
45 	{
46 	    int x, y, w, h;
47 	    x = va_arg(params, int);
48 	    y = va_arg(params, int);
49 	    w = va_arg(params, int);
50 	    h = va_arg(params, int);
51 	    (*__svgalib_driverspecs->accelspecs->FillBox) (x, y, w, h);
52 	    break;
53 	}
54     case ACCEL_SCREENCOPY:
55 	{
56 	    int x1, y1, x2, y2, w, h;
57 	    x1 = va_arg(params, int);
58 	    y1 = va_arg(params, int);
59 	    x2 = va_arg(params, int);
60 	    y2 = va_arg(params, int);
61 	    w = va_arg(params, int);
62 	    h = va_arg(params, int);
63 	    (*__svgalib_driverspecs->accelspecs->ScreenCopy) (x1, y1, x2, y2, w, h);
64 	    break;
65 	}
66     case ACCEL_PUTIMAGE:
67 	{
68 	    int x, y, w, h;
69 	    void *p;
70 	    x = va_arg(params, int);
71 	    y = va_arg(params, int);
72 	    w = va_arg(params, int);
73 	    h = va_arg(params, int);
74 	    p = va_arg(params, void *);
75 	    (*__svgalib_driverspecs->accelspecs->PutImage) (x, y, w, h, p);
76 	    break;
77 	}
78     case ACCEL_DRAWLINE:
79 	{
80 	    int x1, x2, y1, y2;
81 	    x1 = va_arg(params, int);
82 	    y1 = va_arg(params, int);
83 	    x2 = va_arg(params, int);
84 	    y2 = va_arg(params, int);
85 	    (*__svgalib_driverspecs->accelspecs->DrawLine) (x1, y1, x2, y2);
86 	    break;
87 	}
88     case ACCEL_SETFGCOLOR:
89 	{
90 	    int c;
91 	    c = va_arg(params, int);
92 	    (*__svgalib_driverspecs->accelspecs->SetFGColor) (c);
93 	    break;
94 	}
95     case ACCEL_SETBGCOLOR:
96 	{
97 	    int c;
98 	    c = va_arg(params, int);
99 	    (__svgalib_driverspecs->accelspecs->SetBGColor) (c);
100 	    break;
101 	}
102     case ACCEL_SETTRANSPARENCY:
103 	{
104 	    int m, c;
105 	    m = va_arg(params, int);
106 	    c = va_arg(params, int);
107 	    (*__svgalib_driverspecs->accelspecs->SetTransparency) (m, c);
108 	    break;
109 	}
110     case ACCEL_SETRASTEROP:
111 	{
112 	    int r;
113 	    r = va_arg(params, int);
114 	    (*__svgalib_driverspecs->accelspecs->SetRasterOp) (r);
115 	    break;
116 	}
117     case ACCEL_PUTBITMAP:
118 	{
119 	    int x, y, w, h;
120 	    void *p;
121 	    x = va_arg(params, int);
122 	    y = va_arg(params, int);
123 	    w = va_arg(params, int);
124 	    h = va_arg(params, int);
125 	    p = va_arg(params, void *);
126 	    (*__svgalib_driverspecs->accelspecs->PutBitmap) (x, y, w, h, p);
127 	    break;
128 	}
129     case ACCEL_SCREENCOPYBITMAP:
130 	{
131 	    int x1, y1, x2, y2, w, h;
132 	    x1 = va_arg(params, int);
133 	    y1 = va_arg(params, int);
134 	    x2 = va_arg(params, int);
135 	    y2 = va_arg(params, int);
136 	    w = va_arg(params, int);
137 	    h = va_arg(params, int);
138 	    (*__svgalib_driverspecs->accelspecs->ScreenCopyBitmap) (x1, y1, x2, y2, w, h);
139 	    break;
140 	}
141     case ACCEL_DRAWHLINELIST:
142 	{
143 	    int y, n, *x1, *x2;
144 	    y = va_arg(params, int);
145 	    n = va_arg(params, int);
146 	    x1 = va_arg(params, int *);
147 	    x2 = va_arg(params, int *);
148 	    (*__svgalib_driverspecs->accelspecs->DrawHLineList) (y, n, x1, x2);
149 	    break;
150 	}
151     case ACCEL_SETMODE:
152 	{
153 	    int m;
154 	    /* This isn't sent to the chipset-specific driver. */
155 	    m = va_arg(params, int);
156 	    if ((__svgalib_accel_mode & BLITS_IN_BACKGROUND)
157 		&& !(m & BLITS_IN_BACKGROUND))
158 		/* Make sure background blits are finished. */
159 		(*__svgalib_driverspecs->accelspecs->Sync) ();
160 	    __svgalib_accel_mode = m;
161 	    break;
162 	}
163     case ACCEL_SYNC:
164 	(*__svgalib_driverspecs->accelspecs->Sync) ();
165 	break;
166     }				/* switch */
167 
168     va_end(params);
169 
170     vga_unlockvc();
171 
172     return 0;
173 }
174