2 #include <proto/graphics.h>
3 #include <proto/intuition.h>
4 #include <dos/rdargs.h>
5 #include <hidd/graphics.h>
6 #include <aros/macros.h>
7 #include <aros/debug.h>
14 #include "patchrgbconv_macros.h"
15 #include "patchrgbconv_rgbswap.h"
16 #include "patchrgbconv_argb32.h"
17 #include "patchrgbconv_bgra32.h"
18 #include "patchrgbconv_rgba32.h"
19 #include "patchrgbconv_abgr32.h"
20 #include "patchrgbconv_rgb24.h"
21 #include "patchrgbconv_bgr24.h"
22 #include "patchrgbconv_rgb15.h"
23 #include "patchrgbconv_bgr15.h"
24 #include "patchrgbconv_rgb16.h"
25 #include "patchrgbconv_bgr16.h"
26 #include "patchrgbconv_rgb16oe.h"
27 #include "patchrgbconv_bgr16oe.h"
28 #include "patchrgbconv_rgb15oe.h"
29 #include "patchrgbconv_bgr15oe.h"
30 #include "patchrgbconv_xrgb32.h"
31 #include "patchrgbconv_bgrx32.h"
32 #include "patchrgbconv_rgbx32.h"
33 #include "patchrgbconv_xbgr32.h"
35 #include "patchrgbconv_verify.h"
37 #define VERIFY_SIZE 100
39 #define ARG_TEMPLATE "VERIFY=V/S,BENCH=B/N/K,NOISY=N/S"
45 static IPTR args
[ARG_NUM
];
47 static ULONG dstbuf_orig
[VERIFY_SIZE
* 4 + 10];
48 static ULONG dstbuf_new
[VERIFY_SIZE
* 4 + 10];
49 static UBYTE
*benchmem
;
51 static void dumpmem(UBYTE
*buf
, ULONG num
, ULONG size
, STRPTR info
)
57 for(i
= 0; i
< num
; i
++)
59 if ((i
% (32 / size
)) == 0)
64 for(b
= 0; b
< size
; b
++)
69 bug("%02x", buf
[size
- 1 -b
]);
78 typedef void (*DOFUNC
)(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
79 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
80 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
83 static void uninstallfunc(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
84 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
85 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
98 SetRGBConversionFunctionA(srcfmt
, dstfmt
, 0, 0);
102 static void installfunc(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
103 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
104 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
107 ULONG srcbytes
, dstbytes
;
108 ULONG sec1
, sec2
, micro1
, micro2
, time1
= 0, time2
;
110 srcbytes
= (srcbits
+ 7) / 8;
111 dstbytes
= (dstbits
+ 7) / 8;
115 ConvertPixelsA(testpixels
, 0, srcfmt
,
116 dstbuf_orig
, numtestpixels
* dstbytes
, dstfmt
,
118 VERIFY_SIZE
/ numtestpixels
,
123 if (bench
&& benchmem
)
125 CurrentTime(&sec1
, µ1
);
126 ConvertPixelsA(benchmem
, 0, srcfmt
,
131 CurrentTime(&sec2
, µ2
);
133 time1
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
136 SetRGBConversionFunctionA(srcfmt
, dstfmt
, f
, 0);
140 ConvertPixelsA(testpixels
, 0, srcfmt
,
141 dstbuf_new
, numtestpixels
* dstbytes
, dstfmt
,
143 VERIFY_SIZE
/ numtestpixels
,
146 if (memcmp(dstbuf_orig
, dstbuf_new
, (VERIFY_SIZE
/ numtestpixels
) * (numtestpixels
* dstbytes
)) != 0)
148 int numtest
= (VERIFY_SIZE
/ numtestpixels
) * numtestpixels
;
150 bug(" Verify %s to %s (%s to %s) failed!\n",
151 srcfmt_string
, dstfmt_string
,
152 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
]);
154 dumpmem((UBYTE
*)testpixels
, numtestpixels
, srcbytes
, (STRPTR
)"SRC:");
155 dumpmem((UBYTE
*)dstbuf_orig
, numtest
, dstbytes
, (STRPTR
)"OLD:");
156 dumpmem((UBYTE
*)dstbuf_new
, numtest
, dstbytes
, (STRPTR
)"NEW:");
162 if (bench
&& benchmem
)
164 static char sbuf
[256];
166 CurrentTime(&sec1
, µ1
);
167 ConvertPixelsA(benchmem
, 0, srcfmt
,
172 CurrentTime(&sec2
, µ2
);
174 time2
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
176 sprintf(sbuf
, " Benchmark %s to %s (%s to %s): before %ld (%f) after %ld (%f) (%ld %%)\n",
177 srcfmt_string
, dstfmt_string
,
178 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
],
179 time1
, time1
/ 1000000.0,
180 time2
, time2
/ 1000000.0,
181 (time2
? time1
* 100 / time2
: 0));
187 #define PATCHFUNC(a,b) \
188 (*func)(FMT_ ## a, FMT_ ## b, a ## _ ## BITS, b ## _ ## BITS, convert_ ## a ## _ ## b, \
189 verify, bench, testpixels_ ## a, NUMTESTPIXELS_ ## a, # a, # b);
191 int main(int argc
, char **argv
)
193 struct RDArgs
*myargs
;
196 DOFUNC func
= installfunc
;
199 if ((myargs
= ReadArgs((STRPTR
)ARG_TEMPLATE
, args
, NULL
)))
201 if (args
[ARG_VERIFY
]) verify
= TRUE
;
202 if (args
[ARG_BENCH
]) bench
= *(IPTR
*)args
[ARG_BENCH
];
203 if (args
[ARG_NOISY
]) noisy
= TRUE
;
209 PrintFault(IoErr(), (STRPTR
)argv
[0]);
216 benchmem
= malloc(bench
* 4);
219 PrintFault(ERROR_NO_FREE_STORE
, (STRPTR
)argv
[0]);
225 #define P(a,b) PATCHFUNC(a,b)
227 for(i
= 0; i
< 2; i
++)
230 P(ARGB32
,RGB16
) P(ARGB32
,BGR16
) P(ARGB32
,RGB15
) P(ARGB32
,BGR15
)
231 P(ARGB32
,BGRA32
) P(ARGB32
,RGBA32
) P(ARGB32
,ABGR32
) P(ARGB32
,RGB24
)
232 P(ARGB32
,BGR24
) P(ARGB32
,RGB16OE
) P(ARGB32
,BGR16OE
) P(ARGB32
,RGB15OE
)
233 P(ARGB32
,BGR15OE
) P(ARGB32
,XRGB32
) P(ARGB32
,BGRX32
) P(ARGB32
,RGBX32
)
237 P(BGRA32
,RGB16
) P(BGRA32
,BGR16
) P(BGRA32
,RGB15
) P(BGRA32
,BGR15
)
238 P(BGRA32
,ARGB32
) P(BGRA32
,RGBA32
) P(BGRA32
,ABGR32
) P(BGRA32
,RGB24
)
239 P(BGRA32
,BGR24
) P(BGRA32
,RGB16OE
) P(BGRA32
,BGR16OE
) P(BGRA32
,RGB15OE
)
240 P(BGRA32
,BGR15OE
) P(BGRA32
,XRGB32
) P(BGRA32
,BGRX32
) P(BGRA32
,RGBX32
)
244 P(RGBA32
,RGB16
) P(RGBA32
,BGR16
) P(RGBA32
,RGB15
) P(RGBA32
,BGR15
)
245 P(RGBA32
,BGRA32
) P(RGBA32
,ARGB32
) P(RGBA32
,ABGR32
) P(RGBA32
,RGB24
)
246 P(RGBA32
,BGR24
) P(RGBA32
,RGB16OE
) P(RGBA32
,BGR16OE
) P(RGBA32
,RGB15OE
)
247 P(RGBA32
,BGR15OE
) P(RGBA32
,XRGB32
) P(RGBA32
,BGRX32
) P(RGBA32
,RGBX32
)
251 P(ABGR32
,RGB16
) P(ABGR32
,BGR16
) P(ABGR32
,RGB15
) P(ABGR32
,BGR15
)
252 P(ABGR32
,BGRA32
) P(ABGR32
,ARGB32
) P(ABGR32
,RGBA32
) P(ABGR32
,RGB24
)
253 P(ABGR32
,BGR24
) P(ABGR32
,RGB16OE
) P(ABGR32
,BGR16OE
) P(ABGR32
,RGB15OE
)
254 P(ABGR32
,BGR15OE
) P(ABGR32
,XRGB32
) P(ABGR32
,BGRX32
) P(ABGR32
,RGBX32
)
258 P(RGB24
,RGB16
) P(RGB24
,BGR16
) P(RGB24
,RGB15
) P(RGB24
,BGR15
)
259 P(RGB24
,ARGB32
) P(RGB24
,BGRA32
) P(RGB24
,RGBA32
) P(RGB24
,ABGR32
)
260 P(RGB24
,BGR24
) P(RGB24
,RGB16OE
) P(RGB24
,BGR16OE
) P(RGB24
,RGB15OE
)
261 P(RGB24
,BGR15OE
) P(RGB24
,XRGB32
) P(RGB24
,BGRX32
) P(RGB24
,RGBX32
)
265 P(BGR24
,RGB16
) P(BGR24
,BGR16
) P(BGR24
,RGB15
) P(BGR24
,BGR15
)
266 P(BGR24
,ARGB32
) P(BGR24
,BGRA32
) P(BGR24
,RGBA32
) P(BGR24
,ABGR32
)
267 P(BGR24
,RGB24
) P(BGR24
,RGB16OE
) P(BGR24
,BGR16OE
) P(BGR24
,RGB15OE
)
268 P(BGR24
,BGR15OE
) P(BGR24
,XRGB32
) P(BGR24
,BGRX32
) P(BGR24
,RGBX32
)
272 P(RGB15
,RGB16
) P(RGB15
,BGR16
) P(RGB15
,BGR15
) P(RGB15
,ARGB32
)
273 P(RGB15
,BGRA32
) P(RGB15
,RGBA32
) P(RGB15
,ABGR32
) P(RGB15
,RGB24
)
274 P(RGB15
,BGR24
) P(RGB15
,RGB16OE
) P(RGB15
,RGB15OE
) P(RGB15
,BGR16OE
)
275 P(RGB15
,BGR15OE
) P(RGB15
,XRGB32
) P(RGB15
,BGRX32
) P(RGB15
,RGBX32
)
279 P(BGR15
,RGB16
) P(BGR15
,BGR16
) P(BGR15
,RGB15
) P(BGR15
,ARGB32
)
280 P(BGR15
,BGRA32
) P(BGR15
,RGBA32
) P(BGR15
,ABGR32
) P(BGR15
,RGB24
)
281 P(BGR15
,BGR24
) P(BGR15
,RGB16OE
) P(BGR15
,RGB15OE
) P(BGR15
,BGR16OE
)
282 P(BGR15
,BGR15OE
) P(BGR15
,XRGB32
) P(BGR15
,BGRX32
) P(BGR15
,RGBX32
)
286 P(RGB16
,RGB15
) P(RGB16
,BGR16
) P(RGB16
,BGR15
) P(RGB16
,ARGB32
)
287 P(RGB16
,BGRA32
) P(RGB16
,RGBA32
) P(RGB16
,ABGR32
) P(RGB16
,RGB24
)
288 P(RGB16
,BGR24
) P(RGB16
,RGB16OE
) P(RGB16
,RGB15OE
) P(RGB16
,BGR16OE
)
289 P(RGB16
,BGR15OE
) P(RGB16
,XRGB32
) P(RGB16
,BGRX32
) P(RGB16
,RGBX32
)
293 P(BGR16
,RGB15
) P(BGR16
,RGB16
) P(BGR16
,BGR15
) P(BGR16
,ARGB32
)
294 P(BGR16
,BGRA32
) P(BGR16
,RGBA32
) P(BGR16
,ABGR32
) P(BGR16
,RGB24
)
295 P(BGR16
,BGR24
) P(BGR16
,RGB16OE
) P(BGR16
,RGB15OE
) P(BGR16
,BGR16OE
)
296 P(BGR16
,BGR15OE
) P(BGR16
,XRGB32
) P(BGR16
,BGRX32
) P(BGR16
,RGBX32
)
300 P(RGB16OE
,RGB16
) P(RGB16OE
,RGB15
) P(RGB16OE
,BGR16
) P(RGB16OE
,BGR15
)
301 P(RGB16OE
,ARGB32
) P(RGB16OE
,BGRA32
) P(RGB16OE
,RGBA32
) P(RGB16OE
,ABGR32
)
302 P(RGB16OE
,RGB24
) P(RGB16OE
,BGR24
) P(RGB16OE
,RGB15OE
) P(RGB16OE
,BGR16OE
)
303 P(RGB16OE
,BGR15OE
) P(RGB16OE
,XRGB32
) P(RGB16OE
,BGRX32
) P(RGB16OE
,RGBX32
)
307 P(BGR16OE
,RGB16
) P(BGR16OE
,RGB15
) P(BGR16OE
,BGR16
) P(BGR16OE
,BGR15
)
308 P(BGR16OE
,ARGB32
) P(BGR16OE
,BGRA32
) P(BGR16OE
,RGBA32
) P(BGR16OE
,ABGR32
)
309 P(BGR16OE
,RGB24
) P(BGR16OE
,BGR24
) P(BGR16OE
,RGB15OE
) P(BGR16OE
,RGB16OE
)
310 P(BGR16OE
,BGR15OE
) P(BGR16OE
,XRGB32
) P(BGR16OE
,BGRX32
) P(BGR16OE
,RGBX32
)
314 P(RGB15OE
,RGB16
) P(RGB15OE
,RGB15
) P(RGB15OE
,BGR16
) P(RGB15OE
,BGR15
)
315 P(RGB15OE
,ARGB32
) P(RGB15OE
,BGRA32
) P(RGB15OE
,RGBA32
) P(RGB15OE
,ABGR32
)
316 P(RGB15OE
,RGB24
) P(RGB15OE
,BGR24
) P(RGB15OE
,RGB16OE
) P(RGB15OE
,BGR16OE
)
317 P(RGB15OE
,BGR15OE
) P(RGB15OE
,XRGB32
) P(RGB15OE
,BGRX32
) P(RGB15OE
,RGBX32
)
321 P(BGR15OE
,RGB16
) P(BGR15OE
,RGB15
) P(BGR15OE
,BGR16
) P(BGR15OE
,BGR15
)
322 P(BGR15OE
,ARGB32
) P(BGR15OE
,BGRA32
) P(BGR15OE
,RGBA32
) P(BGR15OE
,ABGR32
)
323 P(BGR15OE
,RGB24
) P(BGR15OE
,BGR24
) P(BGR15OE
,RGB16OE
) P(BGR15OE
,BGR16OE
)
324 P(BGR15OE
,RGB15OE
) P(BGR15OE
,XRGB32
) P(BGR15OE
,BGRX32
) P(BGR15OE
,RGBX32
)
328 P(XRGB32
,RGB16
) P(XRGB32
,BGR16
) P(XRGB32
,RGB15
) P(XRGB32
,BGR15
)
329 P(XRGB32
,ARGB32
) P(XRGB32
,BGRA32
) P(XRGB32
,RGBA32
) P(XRGB32
,ABGR32
)
330 P(XRGB32
,RGB24
) P(XRGB32
,BGR24
) P(XRGB32
,RGB16OE
) P(XRGB32
,BGR16OE
)
331 P(XRGB32
,RGB15OE
) P(XRGB32
,BGR15OE
) P(XRGB32
,BGRX32
) P(XRGB32
,RGBX32
)
335 P(BGRX32
,RGB16
) P(BGRX32
,BGR16
) P(BGRX32
,RGB15
) P(BGRX32
,BGR15
)
336 P(BGRX32
,ARGB32
) P(BGRX32
,BGRA32
) P(BGRX32
,RGBA32
) P(BGRX32
,ABGR32
)
337 P(BGRX32
,RGB24
) P(BGRX32
,BGR24
) P(BGRX32
,RGB16OE
) P(BGRX32
,BGR16OE
)
338 P(BGRX32
,RGB15OE
) P(BGRX32
,BGR15OE
) P(BGRX32
,XRGB32
) P(BGRX32
,RGBX32
)
342 P(RGBX32
,RGB16
) P(RGBX32
,BGR16
) P(RGBX32
,RGB15
) P(RGBX32
,BGR15
)
343 P(RGBX32
,BGRA32
) P(RGBX32
,ARGB32
) P(RGBX32
,ABGR32
) P(RGBX32
,RGBA32
)
344 P(RGBX32
,RGB24
) P(RGBX32
,BGR24
) P(RGBX32
,RGB16OE
) P(RGBX32
,BGR16OE
)
345 P(RGBX32
,RGB15OE
) P(RGBX32
,BGR15OE
) P(RGBX32
,XRGB32
) P(RGBX32
,BGRX32
)
349 P(XBGR32
,RGB16
) P(XBGR32
,BGR16
) P(XBGR32
,RGB15
) P(XBGR32
,BGR15
)
350 P(XBGR32
,BGRA32
) P(XBGR32
,ARGB32
) P(XBGR32
,RGBA32
) P(XBGR32
,ABGR32
)
351 P(XBGR32
,RGB24
) P(XBGR32
,BGR24
) P(XBGR32
,RGB16OE
) P(XBGR32
,BGR16OE
)
352 P(XBGR32
,RGB15OE
) P(XBGR32
,BGR15OE
) P(XBGR32
,XRGB32
) P(XBGR32
,BGRX32
)
357 Wait(SIGBREAKF_CTRL_C
);
359 func
= uninstallfunc
;
362 } /* for(int i= 0; i < 2; i++) */