2 Copyright (C) 2002 Michael Niedermayer <michaelni@gmx.at>
4 This program is free software; you can redistribute it and/or modify
5 it under the terms of the GNU General Public License as published by
6 the Free Software Foundation; either version 2 of the License, or
7 (at your option) any later version.
9 This program is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
12 GNU General Public License for more details.
14 You should have received a copy of the GNU General Public License
15 along with this program; if not, write to the Free Software
16 Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
25 #include "../cpudetect.h"
31 static int get_sws_cpuflags()
33 return (gCpuCaps.hasMMX ? SWS_CPU_CAPS_MMX : 0) |
34 (gCpuCaps.hasMMX2 ? SWS_CPU_CAPS_MMX2 : 0) |
35 (gCpuCaps.has3DNow ? SWS_CPU_CAPS_3DNOW : 0);
38 main(int argc, char **argv)
41 uint8_t *srcBuffer= (uint8_t*)memalign(128, SIZE);
42 uint8_t *dstBuffer= (uint8_t*)memalign(128, SIZE);
46 printf("memory corruption test ...\n");
49 GetCpuCaps(&gCpuCaps);
50 printf("testing mmx\n");
53 sws_rgb2rgb_init(get_sws_cpuflags());
55 for(funcNum=0; funcNum<100; funcNum++){
61 printf("."); fflush(stdout);
62 memset(srcBuffer, srcByte, SIZE);
64 for(width=32; width<64; width++){
66 for(dstOffset=128; dstOffset<196; dstOffset++){
68 memset(dstBuffer, dstByte, SIZE);
70 for(srcOffset=128; srcOffset<196; srcOffset++){
71 uint8_t *src= srcBuffer+srcOffset;
72 uint8_t *dst= dstBuffer+dstOffset;
75 if(failed) break; //don't fill the screen with shit ...
82 rgb15to16(src, dst, width*srcBpp);
88 rgb15to24(src, dst, width*srcBpp);
94 rgb15to32(src, dst, width*srcBpp);
100 rgb16to24(src, dst, width*srcBpp);
106 rgb16to32(src, dst, width*srcBpp);
112 rgb24to15(src, dst, width*srcBpp);
118 rgb24to16(src, dst, width*srcBpp);
124 rgb24to32(src, dst, width*srcBpp);
130 rgb32to15(src, dst, width*srcBpp);
136 rgb32to16(src, dst, width*srcBpp);
142 rgb32to24(src, dst, width*srcBpp);
148 rgb16to15(src, dst, width*srcBpp);
155 rgb15tobgr15(src, dst, width*srcBpp);
161 rgb15tobgr16(src, dst, width*srcBpp);
167 rgb15tobgr24(src, dst, width*srcBpp);
173 rgb15tobgr32(src, dst, width*srcBpp);
179 rgb16tobgr15(src, dst, width*srcBpp);
185 rgb16tobgr16(src, dst, width*srcBpp);
191 rgb16tobgr24(src, dst, width*srcBpp);
197 rgb16tobgr32(src, dst, width*srcBpp);
203 rgb24tobgr15(src, dst, width*srcBpp);
209 rgb24tobgr16(src, dst, width*srcBpp);
215 rgb24tobgr24(src, dst, width*srcBpp);
221 rgb24tobgr32(src, dst, width*srcBpp);
227 rgb32tobgr15(src, dst, width*srcBpp);
233 rgb32tobgr16(src, dst, width*srcBpp);
239 rgb32tobgr24(src, dst, width*srcBpp);
245 rgb32tobgr32(src, dst, width*srcBpp);
251 for(i=0; i<SIZE; i++){
252 if(srcBuffer[i]!=srcByte){
253 printf("src damaged at %d w:%d src:%d dst:%d %s\n",
254 i, width, srcOffset, dstOffset, name);
259 for(i=0; i<dstOffset; i++){
260 if(dstBuffer[i]!=dstByte){
261 printf("dst damaged at %d w:%d src:%d dst:%d %s\n",
262 i, width, srcOffset, dstOffset, name);
267 for(i=dstOffset + width*dstBpp; i<SIZE; i++){
268 if(dstBuffer[i]!=dstByte){
269 printf("dst damaged at %d w:%d src:%d dst:%d %s\n",
270 i, width, srcOffset, dstOffset, name);
278 if(failed) failedNum++;
279 else if(srcBpp) passedNum++;
282 printf("%d converters passed, %d converters randomly overwrote memory\n", passedNum, failedNum);