1 #define __OOP_NOATTRBASES__
4 #include <proto/graphics.h>
5 #include <proto/intuition.h>
7 #include <dos/rdargs.h>
8 #include <hidd/graphics.h>
9 #include <aros/macros.h>
10 #include <aros/debug.h>
17 #include "patchrgbconv_macros.h"
18 #include "patchrgbconv_rgbswap.h"
19 #include "patchrgbconv_argb32.h"
20 #include "patchrgbconv_bgra32.h"
21 #include "patchrgbconv_rgba32.h"
22 #include "patchrgbconv_abgr32.h"
23 #include "patchrgbconv_rgb24.h"
24 #include "patchrgbconv_bgr24.h"
25 #include "patchrgbconv_rgb15.h"
26 #include "patchrgbconv_bgr15.h"
27 #include "patchrgbconv_rgb16.h"
28 #include "patchrgbconv_bgr16.h"
29 #include "patchrgbconv_rgb16oe.h"
30 #include "patchrgbconv_bgr16oe.h"
31 #include "patchrgbconv_rgb15oe.h"
32 #include "patchrgbconv_bgr15oe.h"
33 #include "patchrgbconv_xrgb32.h"
34 #include "patchrgbconv_bgrx32.h"
35 #include "patchrgbconv_rgbx32.h"
36 #include "patchrgbconv_xbgr32.h"
38 #include "patchrgbconv_verify.h"
40 #define VERIFY_SIZE 100
42 #define ARG_TEMPLATE "VERIFY=V/S,BENCH=B/N/K,NOISY=N/S"
50 static OOP_AttrBase HiddBitMapAttrBase
;
52 static IPTR args
[ARG_NUM
];
54 static ULONG dstbuf_orig
[VERIFY_SIZE
* 4 + 10];
55 static ULONG dstbuf_new
[VERIFY_SIZE
* 4 + 10];
56 static UBYTE
*benchmem
;
58 static void dumpmem(UBYTE
*buf
, ULONG num
, ULONG size
, STRPTR info
)
64 for(i
= 0; i
< num
; i
++)
66 if ((i
% (32 / size
)) == 0)
71 for(b
= 0; b
< size
; b
++)
76 bug("%02x", buf
[size
- 1 -b
]);
85 void ConvertPixels(APTR srcPixels
, ULONG srcMod
, HIDDT_StdPixFmt srcPixFmt
,
86 APTR dstPixels
, ULONG dstMod
, HIDDT_StdPixFmt dstPixFmt
,
87 ULONG width
, ULONG height
, OOP_Object
*bm
)
89 OOP_Object
*gfxhidd
= NULL
;
90 OOP_Object
*srcpf
, *dstpf
;
94 OOP_GetAttr(bm
, aHidd_BitMap_GfxHidd
, (IPTR
*)&gfxhidd
);
97 bug("ConvertPixels(): Failed to obtain graphics driver\n");
101 srcpf
= HIDD_Gfx_GetPixFmt(gfxhidd
, srcPixFmt
);
102 dstpf
= HIDD_Gfx_GetPixFmt(gfxhidd
, dstPixFmt
);
104 if (!srcpf
|| !dstpf
)
106 bug("ConvertPixels(): Bad source (%d) or dest (%d) pixfmt!\n", srcPixFmt
, dstPixFmt
);
110 HIDD_BM_ConvertPixels(bm
, &src
, (HIDDT_PixelFormat
*)srcpf
, srcMod
,
111 &dst
, (HIDDT_PixelFormat
*)dstpf
, dstMod
,
112 width
, height
, NULL
);
115 typedef void (*DOFUNC
)(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
116 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
117 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
118 char *dstfmt_string
, OOP_Object
*bm
);
120 static void uninstallfunc(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
)
135 HIDD_BM_SetRGBConversionFunction(bm
, srcfmt
, dstfmt
, NULL
);
139 static void installfunc(ULONG srcfmt
, ULONG dstfmt
, ULONG srcbits
, ULONG dstbits
,
140 HIDDT_RGBConversionFunction f
, BOOL verify
, ULONG bench
,
141 APTR testpixels
, ULONG numtestpixels
, char *srcfmt_string
,
142 char *dstfmt_string
, OOP_Object
*bm
)
144 ULONG srcbytes
, dstbytes
;
145 ULONG sec1
, sec2
, micro1
, micro2
, time1
= 0, time2
;
147 srcbytes
= (srcbits
+ 7) / 8;
148 dstbytes
= (dstbits
+ 7) / 8;
152 ConvertPixels(testpixels
, 0, srcfmt
,
153 dstbuf_orig
, numtestpixels
* dstbytes
, dstfmt
,
155 VERIFY_SIZE
/ numtestpixels
,
160 if (bench
&& benchmem
)
162 CurrentTime(&sec1
, µ1
);
163 ConvertPixels(benchmem
, 0, srcfmt
,
168 CurrentTime(&sec2
, µ2
);
170 time1
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
173 HIDD_BM_SetRGBConversionFunction(bm
, srcfmt
, dstfmt
, f
);
177 ConvertPixels(testpixels
, 0, srcfmt
,
178 dstbuf_new
, numtestpixels
* dstbytes
, dstfmt
,
180 VERIFY_SIZE
/ numtestpixels
,
183 if (memcmp(dstbuf_orig
, dstbuf_new
, (VERIFY_SIZE
/ numtestpixels
) * (numtestpixels
* dstbytes
)) != 0)
185 int numtest
= (VERIFY_SIZE
/ numtestpixels
) * numtestpixels
;
187 bug(" Verify %s to %s (%s to %s) failed!\n",
188 srcfmt_string
, dstfmt_string
,
189 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
]);
191 dumpmem((UBYTE
*)testpixels
, numtestpixels
, srcbytes
, (STRPTR
)"SRC:");
192 dumpmem((UBYTE
*)dstbuf_orig
, numtest
, dstbytes
, (STRPTR
)"OLD:");
193 dumpmem((UBYTE
*)dstbuf_new
, numtest
, dstbytes
, (STRPTR
)"NEW:");
199 if (bench
&& benchmem
)
201 static char sbuf
[256];
203 CurrentTime(&sec1
, µ1
);
204 ConvertPixels(benchmem
, 0, srcfmt
,
209 CurrentTime(&sec2
, µ2
);
211 time2
= (sec2
- sec1
) * 1000000 + (((LONG
)micro2
) - ((LONG
)micro1
));
213 sprintf(sbuf
, " Benchmark %s to %s (%s to %s): before %d (%f) after %d (%f) (%d %%)\n",
214 srcfmt_string
, dstfmt_string
,
215 pf_to_string
[srcfmt
], pf_to_string
[dstfmt
],
216 (int)time1
, time1
/ 1000000.0,
217 (int)time2
, time2
/ 1000000.0,
218 (int)(time2
? time1
* 100 / time2
: 0));
224 #define PATCHFUNC(a,b) \
225 (*func)(FMT_ ## a, FMT_ ## b, a ## _ ## BITS, b ## _ ## BITS, convert_ ## a ## _ ## b, \
226 verify, bench, testpixels_ ## a, NUMTESTPIXELS_ ## a, # a, # b, HIDD_BM_OBJ(bitmap));
228 int main(int argc
, char **argv
)
230 struct RDArgs
*myargs
;
233 DOFUNC func
= installfunc
;
235 struct BitMap
*bitmap
;
237 HiddBitMapAttrBase
= OOP_ObtainAttrBase(IID_Hidd_BitMap
);
238 if (!HiddBitMapAttrBase
) {
239 printf("Failed to obtain IID_Hidd_BitMap\n");
244 if ((myargs
= ReadArgs((STRPTR
)ARG_TEMPLATE
, args
, NULL
)))
246 if (args
[ARG_VERIFY
]) verify
= TRUE
;
247 if (args
[ARG_BENCH
]) bench
= *(IPTR
*)args
[ARG_BENCH
];
248 if (args
[ARG_NOISY
]) noisy
= TRUE
;
254 PrintFault(IoErr(), (STRPTR
)argv
[0]);
255 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
261 benchmem
= malloc(bench
* 4);
264 PrintFault(ERROR_NO_FREE_STORE
, (STRPTR
)argv
[0]);
265 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
270 /* We need a placeholder bitmap object in order to talk to bitmap class */
271 bitmap
= AllocBitMap(1, 1, 16, 0, NULL
);
273 PrintFault(ERROR_NO_FREE_STORE
, (STRPTR
)argv
[0]);
274 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);
278 #define P(a,b) PATCHFUNC(a,b)
280 for(i
= 0; i
< 2; i
++)
283 P(ARGB32
,RGB16
) P(ARGB32
,BGR16
) P(ARGB32
,RGB15
) P(ARGB32
,BGR15
)
284 P(ARGB32
,BGRA32
) P(ARGB32
,RGBA32
) P(ARGB32
,ABGR32
) P(ARGB32
,RGB24
)
285 P(ARGB32
,BGR24
) P(ARGB32
,RGB16OE
) P(ARGB32
,BGR16OE
) P(ARGB32
,RGB15OE
)
286 P(ARGB32
,BGR15OE
) P(ARGB32
,XRGB32
) P(ARGB32
,BGRX32
) P(ARGB32
,RGBX32
)
290 P(BGRA32
,RGB16
) P(BGRA32
,BGR16
) P(BGRA32
,RGB15
) P(BGRA32
,BGR15
)
291 P(BGRA32
,ARGB32
) P(BGRA32
,RGBA32
) P(BGRA32
,ABGR32
) P(BGRA32
,RGB24
)
292 P(BGRA32
,BGR24
) P(BGRA32
,RGB16OE
) P(BGRA32
,BGR16OE
) P(BGRA32
,RGB15OE
)
293 P(BGRA32
,BGR15OE
) P(BGRA32
,XRGB32
) P(BGRA32
,BGRX32
) P(BGRA32
,RGBX32
)
297 P(RGBA32
,RGB16
) P(RGBA32
,BGR16
) P(RGBA32
,RGB15
) P(RGBA32
,BGR15
)
298 P(RGBA32
,BGRA32
) P(RGBA32
,ARGB32
) P(RGBA32
,ABGR32
) P(RGBA32
,RGB24
)
299 P(RGBA32
,BGR24
) P(RGBA32
,RGB16OE
) P(RGBA32
,BGR16OE
) P(RGBA32
,RGB15OE
)
300 P(RGBA32
,BGR15OE
) P(RGBA32
,XRGB32
) P(RGBA32
,BGRX32
) P(RGBA32
,RGBX32
)
304 P(ABGR32
,RGB16
) P(ABGR32
,BGR16
) P(ABGR32
,RGB15
) P(ABGR32
,BGR15
)
305 P(ABGR32
,BGRA32
) P(ABGR32
,ARGB32
) P(ABGR32
,RGBA32
) P(ABGR32
,RGB24
)
306 P(ABGR32
,BGR24
) P(ABGR32
,RGB16OE
) P(ABGR32
,BGR16OE
) P(ABGR32
,RGB15OE
)
307 P(ABGR32
,BGR15OE
) P(ABGR32
,XRGB32
) P(ABGR32
,BGRX32
) P(ABGR32
,RGBX32
)
311 P(RGB24
,RGB16
) P(RGB24
,BGR16
) P(RGB24
,RGB15
) P(RGB24
,BGR15
)
312 P(RGB24
,ARGB32
) P(RGB24
,BGRA32
) P(RGB24
,RGBA32
) P(RGB24
,ABGR32
)
313 P(RGB24
,BGR24
) P(RGB24
,RGB16OE
) P(RGB24
,BGR16OE
) P(RGB24
,RGB15OE
)
314 P(RGB24
,BGR15OE
) P(RGB24
,XRGB32
) P(RGB24
,BGRX32
) P(RGB24
,RGBX32
)
318 P(BGR24
,RGB16
) P(BGR24
,BGR16
) P(BGR24
,RGB15
) P(BGR24
,BGR15
)
319 P(BGR24
,ARGB32
) P(BGR24
,BGRA32
) P(BGR24
,RGBA32
) P(BGR24
,ABGR32
)
320 P(BGR24
,RGB24
) P(BGR24
,RGB16OE
) P(BGR24
,BGR16OE
) P(BGR24
,RGB15OE
)
321 P(BGR24
,BGR15OE
) P(BGR24
,XRGB32
) P(BGR24
,BGRX32
) P(BGR24
,RGBX32
)
325 P(RGB15
,RGB16
) P(RGB15
,BGR16
) P(RGB15
,BGR15
) P(RGB15
,ARGB32
)
326 P(RGB15
,BGRA32
) P(RGB15
,RGBA32
) P(RGB15
,ABGR32
) P(RGB15
,RGB24
)
327 P(RGB15
,BGR24
) P(RGB15
,RGB16OE
) P(RGB15
,RGB15OE
) P(RGB15
,BGR16OE
)
328 P(RGB15
,BGR15OE
) P(RGB15
,XRGB32
) P(RGB15
,BGRX32
) P(RGB15
,RGBX32
)
332 P(BGR15
,RGB16
) P(BGR15
,BGR16
) P(BGR15
,RGB15
) P(BGR15
,ARGB32
)
333 P(BGR15
,BGRA32
) P(BGR15
,RGBA32
) P(BGR15
,ABGR32
) P(BGR15
,RGB24
)
334 P(BGR15
,BGR24
) P(BGR15
,RGB16OE
) P(BGR15
,RGB15OE
) P(BGR15
,BGR16OE
)
335 P(BGR15
,BGR15OE
) P(BGR15
,XRGB32
) P(BGR15
,BGRX32
) P(BGR15
,RGBX32
)
339 P(RGB16
,RGB15
) P(RGB16
,BGR16
) P(RGB16
,BGR15
) P(RGB16
,ARGB32
)
340 P(RGB16
,BGRA32
) P(RGB16
,RGBA32
) P(RGB16
,ABGR32
) P(RGB16
,RGB24
)
341 P(RGB16
,BGR24
) P(RGB16
,RGB16OE
) P(RGB16
,RGB15OE
) P(RGB16
,BGR16OE
)
342 P(RGB16
,BGR15OE
) P(RGB16
,XRGB32
) P(RGB16
,BGRX32
) P(RGB16
,RGBX32
)
346 P(BGR16
,RGB15
) P(BGR16
,RGB16
) P(BGR16
,BGR15
) P(BGR16
,ARGB32
)
347 P(BGR16
,BGRA32
) P(BGR16
,RGBA32
) P(BGR16
,ABGR32
) P(BGR16
,RGB24
)
348 P(BGR16
,BGR24
) P(BGR16
,RGB16OE
) P(BGR16
,RGB15OE
) P(BGR16
,BGR16OE
)
349 P(BGR16
,BGR15OE
) P(BGR16
,XRGB32
) P(BGR16
,BGRX32
) P(BGR16
,RGBX32
)
353 P(RGB16OE
,RGB16
) P(RGB16OE
,RGB15
) P(RGB16OE
,BGR16
) P(RGB16OE
,BGR15
)
354 P(RGB16OE
,ARGB32
) P(RGB16OE
,BGRA32
) P(RGB16OE
,RGBA32
) P(RGB16OE
,ABGR32
)
355 P(RGB16OE
,RGB24
) P(RGB16OE
,BGR24
) P(RGB16OE
,RGB15OE
) P(RGB16OE
,BGR16OE
)
356 P(RGB16OE
,BGR15OE
) P(RGB16OE
,XRGB32
) P(RGB16OE
,BGRX32
) P(RGB16OE
,RGBX32
)
360 P(BGR16OE
,RGB16
) P(BGR16OE
,RGB15
) P(BGR16OE
,BGR16
) P(BGR16OE
,BGR15
)
361 P(BGR16OE
,ARGB32
) P(BGR16OE
,BGRA32
) P(BGR16OE
,RGBA32
) P(BGR16OE
,ABGR32
)
362 P(BGR16OE
,RGB24
) P(BGR16OE
,BGR24
) P(BGR16OE
,RGB15OE
) P(BGR16OE
,RGB16OE
)
363 P(BGR16OE
,BGR15OE
) P(BGR16OE
,XRGB32
) P(BGR16OE
,BGRX32
) P(BGR16OE
,RGBX32
)
367 P(RGB15OE
,RGB16
) P(RGB15OE
,RGB15
) P(RGB15OE
,BGR16
) P(RGB15OE
,BGR15
)
368 P(RGB15OE
,ARGB32
) P(RGB15OE
,BGRA32
) P(RGB15OE
,RGBA32
) P(RGB15OE
,ABGR32
)
369 P(RGB15OE
,RGB24
) P(RGB15OE
,BGR24
) P(RGB15OE
,RGB16OE
) P(RGB15OE
,BGR16OE
)
370 P(RGB15OE
,BGR15OE
) P(RGB15OE
,XRGB32
) P(RGB15OE
,BGRX32
) P(RGB15OE
,RGBX32
)
374 P(BGR15OE
,RGB16
) P(BGR15OE
,RGB15
) P(BGR15OE
,BGR16
) P(BGR15OE
,BGR15
)
375 P(BGR15OE
,ARGB32
) P(BGR15OE
,BGRA32
) P(BGR15OE
,RGBA32
) P(BGR15OE
,ABGR32
)
376 P(BGR15OE
,RGB24
) P(BGR15OE
,BGR24
) P(BGR15OE
,RGB16OE
) P(BGR15OE
,BGR16OE
)
377 P(BGR15OE
,RGB15OE
) P(BGR15OE
,XRGB32
) P(BGR15OE
,BGRX32
) P(BGR15OE
,RGBX32
)
381 P(XRGB32
,RGB16
) P(XRGB32
,BGR16
) P(XRGB32
,RGB15
) P(XRGB32
,BGR15
)
382 P(XRGB32
,ARGB32
) P(XRGB32
,BGRA32
) P(XRGB32
,RGBA32
) P(XRGB32
,ABGR32
)
383 P(XRGB32
,RGB24
) P(XRGB32
,BGR24
) P(XRGB32
,RGB16OE
) P(XRGB32
,BGR16OE
)
384 P(XRGB32
,RGB15OE
) P(XRGB32
,BGR15OE
) P(XRGB32
,BGRX32
) P(XRGB32
,RGBX32
)
388 P(BGRX32
,RGB16
) P(BGRX32
,BGR16
) P(BGRX32
,RGB15
) P(BGRX32
,BGR15
)
389 P(BGRX32
,ARGB32
) P(BGRX32
,BGRA32
) P(BGRX32
,RGBA32
) P(BGRX32
,ABGR32
)
390 P(BGRX32
,RGB24
) P(BGRX32
,BGR24
) P(BGRX32
,RGB16OE
) P(BGRX32
,BGR16OE
)
391 P(BGRX32
,RGB15OE
) P(BGRX32
,BGR15OE
) P(BGRX32
,XRGB32
) P(BGRX32
,RGBX32
)
395 P(RGBX32
,RGB16
) P(RGBX32
,BGR16
) P(RGBX32
,RGB15
) P(RGBX32
,BGR15
)
396 P(RGBX32
,BGRA32
) P(RGBX32
,ARGB32
) P(RGBX32
,ABGR32
) P(RGBX32
,RGBA32
)
397 P(RGBX32
,RGB24
) P(RGBX32
,BGR24
) P(RGBX32
,RGB16OE
) P(RGBX32
,BGR16OE
)
398 P(RGBX32
,RGB15OE
) P(RGBX32
,BGR15OE
) P(RGBX32
,XRGB32
) P(RGBX32
,BGRX32
)
402 P(XBGR32
,RGB16
) P(XBGR32
,BGR16
) P(XBGR32
,RGB15
) P(XBGR32
,BGR15
)
403 P(XBGR32
,BGRA32
) P(XBGR32
,ARGB32
) P(XBGR32
,RGBA32
) P(XBGR32
,ABGR32
)
404 P(XBGR32
,RGB24
) P(XBGR32
,BGR24
) P(XBGR32
,RGB16OE
) P(XBGR32
,BGR16OE
)
405 P(XBGR32
,RGB15OE
) P(XBGR32
,BGR15OE
) P(XBGR32
,XRGB32
) P(XBGR32
,BGRX32
)
410 Wait(SIGBREAKF_CTRL_C
);
412 func
= uninstallfunc
;
415 } /* for(int i= 0; i < 2; i++) */
420 OOP_ReleaseAttrBase(IID_Hidd_BitMap
);