2 Copyright © 1995-2014, The AROS Development Team. All rights reserved.
6 #define __OOP_NOATTRBASES__
9 #include <proto/graphics.h>
10 #include <proto/intuition.h>
11 #include <proto/oop.h>
12 #include <dos/rdargs.h>
13 #include <hidd/graphics.h>
14 #include <aros/macros.h>
15 #include <aros/debug.h>
22 #include "patchrgbconv_macros.h"
23 #include "patchrgbconv_rgbswap.h"
24 #include "patchrgbconv_argb32.h"
25 #include "patchrgbconv_bgra32.h"
26 #include "patchrgbconv_rgba32.h"
27 #include "patchrgbconv_abgr32.h"
28 #include "patchrgbconv_rgb24.h"
29 #include "patchrgbconv_bgr24.h"
30 #include "patchrgbconv_rgb15.h"
31 #include "patchrgbconv_bgr15.h"
32 #include "patchrgbconv_rgb16.h"
33 #include "patchrgbconv_bgr16.h"
34 #include "patchrgbconv_rgb16oe.h"
35 #include "patchrgbconv_bgr16oe.h"
36 #include "patchrgbconv_rgb15oe.h"
37 #include "patchrgbconv_bgr15oe.h"
38 #include "patchrgbconv_xrgb32.h"
39 #include "patchrgbconv_bgrx32.h"
40 #include "patchrgbconv_rgbx32.h"
41 #include "patchrgbconv_xbgr32.h"
43 #include "patchrgbconv_verify.h"
45 #define VERIFY_SIZE 100
47 #define ARG_TEMPLATE "VERIFY=V/S,BENCH=B/N/K,NOISY=N/S"
55 static OOP_AttrBase HiddBitMapAttrBase
;
57 static IPTR args
[ARG_NUM
];
59 static ULONG dstbuf_orig
[VERIFY_SIZE
* 4 + 10];
60 static ULONG dstbuf_new
[VERIFY_SIZE
* 4 + 10];
61 static UBYTE
*benchmem
;
63 static void dumpmem(UBYTE
*buf
, ULONG num
, ULONG size
, STRPTR info
)
69 for(i
= 0; i
< num
; i
++)
71 if ((i
% (32 / size
)) == 0)
76 for(b
= 0; b
< size
; b
++)
81 bug("%02x", buf
[size
- 1 -b
]);
90 void ConvertPixels(APTR srcPixels
, ULONG srcMod
, HIDDT_StdPixFmt srcPixFmt
,
91 APTR dstPixels
, ULONG dstMod
, HIDDT_StdPixFmt dstPixFmt
,
92 ULONG width
, ULONG height
, OOP_Object
*bm
)
94 OOP_Object
*gfxhidd
= NULL
;
95 OOP_Object
*srcpf
, *dstpf
;
99 OOP_GetAttr(bm
, aHidd_BitMap_GfxHidd
, (IPTR
*)&gfxhidd
);
102 bug("ConvertPixels(): Failed to obtain graphics driver\n");
106 srcpf
= HIDD_Gfx_GetPixFmt(gfxhidd
, srcPixFmt
);
107 dstpf
= HIDD_Gfx_GetPixFmt(gfxhidd
, dstPixFmt
);
109 if (!srcpf
|| !dstpf
)
111 bug("ConvertPixels(): Bad source (%d) or dest (%d) pixfmt!\n", srcPixFmt
, dstPixFmt
);
115 HIDD_BM_ConvertPixels(bm
, &src
, (HIDDT_PixelFormat
*)srcpf
, srcMod
,
116 &dst
, (HIDDT_PixelFormat
*)dstpf
, dstMod
,
117 width
, height
, NULL
);
120 typedef void (*DOFUNC
)(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
121 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
122 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
123 char *dstfmt_string
, OOP_Object
*bm
);
125 static void uninstallfunc(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
126 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
127 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
128 char *dstfmt_string
, OOP_Object
*bm
)
140 HIDD_BM_SetRGBConversionFunction(bm
, srcfmt
, dstfmt
, NULL
);
144 static void installfunc(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
145 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
146 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
147 char *dstfmt_string
, OOP_Object
*bm
)
149 ULONG srcbytes
, dstbytes
;
150 ULONG sec1
, sec2
, micro1
, micro2
, time1
= 0, time2
;
152 srcbytes
= (srcbits
+ 7) / 8;
153 dstbytes
= (dstbits
+ 7) / 8;
157 ConvertPixels(testpixels
, 0, srcfmt
,
158 dstbuf_orig
, numtestpixels
* dstbytes
, dstfmt
,
160 VERIFY_SIZE
/ numtestpixels
,
165 if (bench
&& benchmem
)
167 CurrentTime(&sec1
, µ1
);
168 ConvertPixels(benchmem
, 0, srcfmt
,
173 CurrentTime(&sec2
, µ2
);
175 time1
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
178 HIDD_BM_SetRGBConversionFunction(bm
, srcfmt
, dstfmt
, f
);
182 ConvertPixels(testpixels
, 0, srcfmt
,
183 dstbuf_new
, numtestpixels
* dstbytes
, dstfmt
,
185 VERIFY_SIZE
/ numtestpixels
,
188 if (memcmp(dstbuf_orig
, dstbuf_new
, (VERIFY_SIZE
/ numtestpixels
) * (numtestpixels
* dstbytes
)) != 0)
190 int numtest
= (VERIFY_SIZE
/ numtestpixels
) * numtestpixels
;
192 bug(" Verify %s to %s (%s to %s) failed!\n",
193 srcfmt_string
, dstfmt_string
,
194 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
]);
196 dumpmem((UBYTE
*)testpixels
, numtestpixels
, srcbytes
, (STRPTR
)"SRC:");
197 dumpmem((UBYTE
*)dstbuf_orig
, numtest
, dstbytes
, (STRPTR
)"OLD:");
198 dumpmem((UBYTE
*)dstbuf_new
, numtest
, dstbytes
, (STRPTR
)"NEW:");
204 if (bench
&& benchmem
)
206 static char sbuf
[256];
208 CurrentTime(&sec1
, µ1
);
209 ConvertPixels(benchmem
, 0, srcfmt
,
214 CurrentTime(&sec2
, µ2
);
216 time2
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
218 sprintf(sbuf
, " Benchmark %s to %s (%s to %s): before %d (%f) after %d (%f) (%d %%)\n",
219 srcfmt_string
, dstfmt_string
,
220 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
],
221 (int)time1
, time1
/ 1000000.0,
222 (int)time2
, time2
/ 1000000.0,
223 (int)(time2
? time1
* 100 / time2
: 0));
229 #define PATCHFUNC(a,b) \
230 (*func)(FMT_ ## a, FMT_ ## b, a ## _ ## BITS, b ## _ ## BITS, convert_ ## a ## _ ## b, \
231 verify, bench, testpixels_ ## a, NUMTESTPIXELS_ ## a, # a, # b, HIDD_BM_OBJ(bitmap));
233 int main(int argc
, char **argv
)
235 struct RDArgs
*myargs
;
238 DOFUNC func
= installfunc
;
240 struct BitMap
*bitmap
;
242 HiddBitMapAttrBase
= OOP_ObtainAttrBase(IID_Hidd_BitMap
);
243 if (!HiddBitMapAttrBase
) {
244 printf("Failed to obtain IID_Hidd_BitMap\n");
249 if ((myargs
= ReadArgs((STRPTR
)ARG_TEMPLATE
, args
, NULL
)))
251 if (args
[ARG_VERIFY
]) verify
= TRUE
;
252 if (args
[ARG_BENCH
]) bench
= *(IPTR
*)args
[ARG_BENCH
];
253 if (args
[ARG_NOISY
]) noisy
= TRUE
;
259 PrintFault(IoErr(), (STRPTR
)argv
[0]);
260 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
266 benchmem
= malloc(bench
* 4);
269 PrintFault(ERROR_NO_FREE_STORE
, (STRPTR
)argv
[0]);
270 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
275 /* We need a placeholder bitmap object in order to talk to bitmap class */
276 bitmap
= AllocBitMap(1, 1, 16, 0, NULL
);
278 PrintFault(ERROR_NO_FREE_STORE
, (STRPTR
)argv
[0]);
279 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
283 #define P(a,b) PATCHFUNC(a,b)
285 for(i
= 0; i
< 2; i
++)
288 P(ARGB32
,RGB16
) P(ARGB32
,BGR16
) P(ARGB32
,RGB15
) P(ARGB32
,BGR15
)
289 P(ARGB32
,BGRA32
) P(ARGB32
,RGBA32
) P(ARGB32
,ABGR32
) P(ARGB32
,RGB24
)
290 P(ARGB32
,BGR24
) P(ARGB32
,RGB16OE
) P(ARGB32
,BGR16OE
) P(ARGB32
,RGB15OE
)
291 P(ARGB32
,BGR15OE
) P(ARGB32
,XRGB32
) P(ARGB32
,BGRX32
) P(ARGB32
,RGBX32
)
295 P(BGRA32
,RGB16
) P(BGRA32
,BGR16
) P(BGRA32
,RGB15
) P(BGRA32
,BGR15
)
296 P(BGRA32
,ARGB32
) P(BGRA32
,RGBA32
) P(BGRA32
,ABGR32
) P(BGRA32
,RGB24
)
297 P(BGRA32
,BGR24
) P(BGRA32
,RGB16OE
) P(BGRA32
,BGR16OE
) P(BGRA32
,RGB15OE
)
298 P(BGRA32
,BGR15OE
) P(BGRA32
,XRGB32
) P(BGRA32
,BGRX32
) P(BGRA32
,RGBX32
)
302 P(RGBA32
,RGB16
) P(RGBA32
,BGR16
) P(RGBA32
,RGB15
) P(RGBA32
,BGR15
)
303 P(RGBA32
,BGRA32
) P(RGBA32
,ARGB32
) P(RGBA32
,ABGR32
) P(RGBA32
,RGB24
)
304 P(RGBA32
,BGR24
) P(RGBA32
,RGB16OE
) P(RGBA32
,BGR16OE
) P(RGBA32
,RGB15OE
)
305 P(RGBA32
,BGR15OE
) P(RGBA32
,XRGB32
) P(RGBA32
,BGRX32
) P(RGBA32
,RGBX32
)
309 P(ABGR32
,RGB16
) P(ABGR32
,BGR16
) P(ABGR32
,RGB15
) P(ABGR32
,BGR15
)
310 P(ABGR32
,BGRA32
) P(ABGR32
,ARGB32
) P(ABGR32
,RGBA32
) P(ABGR32
,RGB24
)
311 P(ABGR32
,BGR24
) P(ABGR32
,RGB16OE
) P(ABGR32
,BGR16OE
) P(ABGR32
,RGB15OE
)
312 P(ABGR32
,BGR15OE
) P(ABGR32
,XRGB32
) P(ABGR32
,BGRX32
) P(ABGR32
,RGBX32
)
316 P(RGB24
,RGB16
) P(RGB24
,BGR16
) P(RGB24
,RGB15
) P(RGB24
,BGR15
)
317 P(RGB24
,ARGB32
) P(RGB24
,BGRA32
) P(RGB24
,RGBA32
) P(RGB24
,ABGR32
)
318 P(RGB24
,BGR24
) P(RGB24
,RGB16OE
) P(RGB24
,BGR16OE
) P(RGB24
,RGB15OE
)
319 P(RGB24
,BGR15OE
) P(RGB24
,XRGB32
) P(RGB24
,BGRX32
) P(RGB24
,RGBX32
)
323 P(BGR24
,RGB16
) P(BGR24
,BGR16
) P(BGR24
,RGB15
) P(BGR24
,BGR15
)
324 P(BGR24
,ARGB32
) P(BGR24
,BGRA32
) P(BGR24
,RGBA32
) P(BGR24
,ABGR32
)
325 P(BGR24
,RGB24
) P(BGR24
,RGB16OE
) P(BGR24
,BGR16OE
) P(BGR24
,RGB15OE
)
326 P(BGR24
,BGR15OE
) P(BGR24
,XRGB32
) P(BGR24
,BGRX32
) P(BGR24
,RGBX32
)
330 P(RGB15
,RGB16
) P(RGB15
,BGR16
) P(RGB15
,BGR15
) P(RGB15
,ARGB32
)
331 P(RGB15
,BGRA32
) P(RGB15
,RGBA32
) P(RGB15
,ABGR32
) P(RGB15
,RGB24
)
332 P(RGB15
,BGR24
) P(RGB15
,RGB16OE
) P(RGB15
,RGB15OE
) P(RGB15
,BGR16OE
)
333 P(RGB15
,BGR15OE
) P(RGB15
,XRGB32
) P(RGB15
,BGRX32
) P(RGB15
,RGBX32
)
337 P(BGR15
,RGB16
) P(BGR15
,BGR16
) P(BGR15
,RGB15
) P(BGR15
,ARGB32
)
338 P(BGR15
,BGRA32
) P(BGR15
,RGBA32
) P(BGR15
,ABGR32
) P(BGR15
,RGB24
)
339 P(BGR15
,BGR24
) P(BGR15
,RGB16OE
) P(BGR15
,RGB15OE
) P(BGR15
,BGR16OE
)
340 P(BGR15
,BGR15OE
) P(BGR15
,XRGB32
) P(BGR15
,BGRX32
) P(BGR15
,RGBX32
)
344 P(RGB16
,RGB15
) P(RGB16
,BGR16
) P(RGB16
,BGR15
) P(RGB16
,ARGB32
)
345 P(RGB16
,BGRA32
) P(RGB16
,RGBA32
) P(RGB16
,ABGR32
) P(RGB16
,RGB24
)
346 P(RGB16
,BGR24
) P(RGB16
,RGB16OE
) P(RGB16
,RGB15OE
) P(RGB16
,BGR16OE
)
347 P(RGB16
,BGR15OE
) P(RGB16
,XRGB32
) P(RGB16
,BGRX32
) P(RGB16
,RGBX32
)
351 P(BGR16
,RGB15
) P(BGR16
,RGB16
) P(BGR16
,BGR15
) P(BGR16
,ARGB32
)
352 P(BGR16
,BGRA32
) P(BGR16
,RGBA32
) P(BGR16
,ABGR32
) P(BGR16
,RGB24
)
353 P(BGR16
,BGR24
) P(BGR16
,RGB16OE
) P(BGR16
,RGB15OE
) P(BGR16
,BGR16OE
)
354 P(BGR16
,BGR15OE
) P(BGR16
,XRGB32
) P(BGR16
,BGRX32
) P(BGR16
,RGBX32
)
358 P(RGB16OE
,RGB16
) P(RGB16OE
,RGB15
) P(RGB16OE
,BGR16
) P(RGB16OE
,BGR15
)
359 P(RGB16OE
,ARGB32
) P(RGB16OE
,BGRA32
) P(RGB16OE
,RGBA32
) P(RGB16OE
,ABGR32
)
360 P(RGB16OE
,RGB24
) P(RGB16OE
,BGR24
) P(RGB16OE
,RGB15OE
) P(RGB16OE
,BGR16OE
)
361 P(RGB16OE
,BGR15OE
) P(RGB16OE
,XRGB32
) P(RGB16OE
,BGRX32
) P(RGB16OE
,RGBX32
)
365 P(BGR16OE
,RGB16
) P(BGR16OE
,RGB15
) P(BGR16OE
,BGR16
) P(BGR16OE
,BGR15
)
366 P(BGR16OE
,ARGB32
) P(BGR16OE
,BGRA32
) P(BGR16OE
,RGBA32
) P(BGR16OE
,ABGR32
)
367 P(BGR16OE
,RGB24
) P(BGR16OE
,BGR24
) P(BGR16OE
,RGB15OE
) P(BGR16OE
,RGB16OE
)
368 P(BGR16OE
,BGR15OE
) P(BGR16OE
,XRGB32
) P(BGR16OE
,BGRX32
) P(BGR16OE
,RGBX32
)
372 P(RGB15OE
,RGB16
) P(RGB15OE
,RGB15
) P(RGB15OE
,BGR16
) P(RGB15OE
,BGR15
)
373 P(RGB15OE
,ARGB32
) P(RGB15OE
,BGRA32
) P(RGB15OE
,RGBA32
) P(RGB15OE
,ABGR32
)
374 P(RGB15OE
,RGB24
) P(RGB15OE
,BGR24
) P(RGB15OE
,RGB16OE
) P(RGB15OE
,BGR16OE
)
375 P(RGB15OE
,BGR15OE
) P(RGB15OE
,XRGB32
) P(RGB15OE
,BGRX32
) P(RGB15OE
,RGBX32
)
379 P(BGR15OE
,RGB16
) P(BGR15OE
,RGB15
) P(BGR15OE
,BGR16
) P(BGR15OE
,BGR15
)
380 P(BGR15OE
,ARGB32
) P(BGR15OE
,BGRA32
) P(BGR15OE
,RGBA32
) P(BGR15OE
,ABGR32
)
381 P(BGR15OE
,RGB24
) P(BGR15OE
,BGR24
) P(BGR15OE
,RGB16OE
) P(BGR15OE
,BGR16OE
)
382 P(BGR15OE
,RGB15OE
) P(BGR15OE
,XRGB32
) P(BGR15OE
,BGRX32
) P(BGR15OE
,RGBX32
)
386 P(XRGB32
,RGB16
) P(XRGB32
,BGR16
) P(XRGB32
,RGB15
) P(XRGB32
,BGR15
)
387 P(XRGB32
,ARGB32
) P(XRGB32
,BGRA32
) P(XRGB32
,RGBA32
) P(XRGB32
,ABGR32
)
388 P(XRGB32
,RGB24
) P(XRGB32
,BGR24
) P(XRGB32
,RGB16OE
) P(XRGB32
,BGR16OE
)
389 P(XRGB32
,RGB15OE
) P(XRGB32
,BGR15OE
) P(XRGB32
,BGRX32
) P(XRGB32
,RGBX32
)
393 P(BGRX32
,RGB16
) P(BGRX32
,BGR16
) P(BGRX32
,RGB15
) P(BGRX32
,BGR15
)
394 P(BGRX32
,ARGB32
) P(BGRX32
,BGRA32
) P(BGRX32
,RGBA32
) P(BGRX32
,ABGR32
)
395 P(BGRX32
,RGB24
) P(BGRX32
,BGR24
) P(BGRX32
,RGB16OE
) P(BGRX32
,BGR16OE
)
396 P(BGRX32
,RGB15OE
) P(BGRX32
,BGR15OE
) P(BGRX32
,XRGB32
) P(BGRX32
,RGBX32
)
400 P(RGBX32
,RGB16
) P(RGBX32
,BGR16
) P(RGBX32
,RGB15
) P(RGBX32
,BGR15
)
401 P(RGBX32
,BGRA32
) P(RGBX32
,ARGB32
) P(RGBX32
,ABGR32
) P(RGBX32
,RGBA32
)
402 P(RGBX32
,RGB24
) P(RGBX32
,BGR24
) P(RGBX32
,RGB16OE
) P(RGBX32
,BGR16OE
)
403 P(RGBX32
,RGB15OE
) P(RGBX32
,BGR15OE
) P(RGBX32
,XRGB32
) P(RGBX32
,BGRX32
)
407 P(XBGR32
,RGB16
) P(XBGR32
,BGR16
) P(XBGR32
,RGB15
) P(XBGR32
,BGR15
)
408 P(XBGR32
,BGRA32
) P(XBGR32
,ARGB32
) P(XBGR32
,RGBA32
) P(XBGR32
,ABGR32
)
409 P(XBGR32
,RGB24
) P(XBGR32
,BGR24
) P(XBGR32
,RGB16OE
) P(XBGR32
,BGR16OE
)
410 P(XBGR32
,RGB15OE
) P(XBGR32
,BGR15OE
) P(XBGR32
,XRGB32
) P(XBGR32
,BGRX32
)
415 Wait(SIGBREAKF_CTRL_C
);
417 func
= uninstallfunc
;
420 } /* for(int i= 0; i < 2; i++) */
425 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);