@@ -4206,36 +4206,39 @@ const struct test_file
42064206 uint32_t m_etc1s_size;
42074207 float m_etc1s_psnr;
42084208 float m_uastc_psnr;
4209+
4210+ uint32_t m_etc1s_128_size;
4211+ float m_etc1s_128_psnr;
42094212} g_test_files[] =
42104213{
4211- { " black_1x1.png" , 189 , 100 .0f , 100 .0f },
4212- { " kodim01.png" , 30993 , 27 .40f , 44 .14f },
4213- { " kodim02.png" , 28529 , 32 .20f , 41 .06f },
4214- { " kodim03.png" , 23411 , 32 .57f , 44 .87f },
4215- { " kodim04.png" , 28256 , 31 .76f , 43 .02f },
4216- { " kodim05.png" , 32646 , 25 .94f , 40 .28f },
4217- { " kodim06.png" , 27336 , 28 .66f , 44 .57f },
4218- { " kodim07.png" , 26618 , 31 .51f , 43 .94f },
4219- { " kodim08.png" , 31133 , 25 .28f , 41 .15f },
4220- { " kodim09.png" , 24777 , 32 .05f , 45 .85f },
4221- { " kodim10.png" , 27247 , 32 .20f , 45 .77f },
4222- { " kodim11.png" , 26579 , 29 .22f , 43 .68f },
4223- { " kodim12.png" , 25102 , 32 .96f , 46 .77f },
4224- { " kodim13.png" , 31604 , 24 .25f , 41 .25f },
4225- { " kodim14.png" , 31162 , 27 .81f , 39 .65f },
4226- { " kodim15.png" , 25528 , 31 .26f , 42 .87f },
4227- { " kodim16.png" , 26894 , 32 .21f , 47 .78f },
4228- { " kodim17.png" , 29334 , 31 .40f , 45 .66f },
4229- { " kodim18.png" , 30929 , 27 .46f , 41 .54f },
4230- { " kodim19.png" , 27889 , 29 .69f , 44 .95f },
4231- { " kodim20.png" , 21104 , 31 .30f , 45 .31f },
4232- { " kodim21.png" , 25943 , 28 .53f , 44 .45f },
4233- { " kodim22.png" , 29277 , 29 .85f , 42 .63f },
4234- { " kodim23.png" , 23550 , 31 .69f , 45 .11f },
4235- { " kodim24.png" , 29613 , 26 .75f , 40 .61f },
4236- { " white_1x1.png" , 189 , 100 .0f , 100 .0f },
4237- { " wikipedia.png" , 38961 , 24 .10f , 30 .47f },
4238- { " alpha0.png" , 766 , 100 .0f , 56 .16f }
4214+ { " black_1x1.png" , 189 , 100 .0f , 100 .0f , 189 , 100 . 0f },
4215+ { " kodim01.png" , 30993 , 27 .40f , 44 .14f , 58354 , 30 . 356064f },
4216+ { " kodim02.png" , 28529 , 32 .20f , 41 .06f , 51411 , 34 . 713940f },
4217+ { " kodim03.png" , 23411 , 32 .57f , 44 .87f , 49282 , 36 . 709675f },
4218+ { " kodim04.png" , 28256 , 31 .76f , 43 .02f , 57003 , 34 . 864861f },
4219+ { " kodim05.png" , 32646 , 25 .94f , 40 .28f , 65731 , 29 . 935091f },
4220+ { " kodim06.png" , 27336 , 28 .66f , 44 .57f , 54963 , 32 . 294220f },
4221+ { " kodim07.png" , 26618 , 31 .51f , 43 .94f , 53352 , 35 . 576595f },
4222+ { " kodim08.png" , 31133 , 25 .28f , 41 .15f , 63347 , 29 . 509914f },
4223+ { " kodim09.png" , 24777 , 32 .05f , 45 .85f , 51355 , 35 . 985966f },
4224+ { " kodim10.png" , 27247 , 32 .20f , 45 .77f , 54291 , 36 . 395000f },
4225+ { " kodim11.png" , 26579 , 29 .22f , 43 .68f , 55491 , 33 . 468971f },
4226+ { " kodim12.png" , 25102 , 32 .96f , 46 .77f , 51465 , 36 . 722233f },
4227+ { " kodim13.png" , 31604 , 24 .25f , 41 .25f , 62629 , 27 . 588623f },
4228+ { " kodim14.png" , 31162 , 27 .81f , 39 .65f , 62866 , 31 . 206463f },
4229+ { " kodim15.png" , 25528 , 31 .26f , 42 .87f , 53343 , 35 . 026314f },
4230+ { " kodim16.png" , 26894 , 32 .21f , 47 .78f , 51325 , 35 . 555458f },
4231+ { " kodim17.png" , 29334 , 31 .40f , 45 .66f , 55630 , 35 . 909283f },
4232+ { " kodim18.png" , 30929 , 27 .46f , 41 .54f , 62421 , 31 . 348171f },
4233+ { " kodim19.png" , 27889 , 29 .69f , 44 .95f , 55055 , 33 . 613987f },
4234+ { " kodim20.png" , 21104 , 31 .30f , 45 .31f , 47136 , 35 . 759407f },
4235+ { " kodim21.png" , 25943 , 28 .53f , 44 .45f , 54768 , 32 . 415817f },
4236+ { " kodim22.png" , 29277 , 29 .85f , 42 .63f , 60889 , 33 . 495415f },
4237+ { " kodim23.png" , 23550 , 31 .69f , 45 .11f , 53774 , 36 . 223492f },
4238+ { " kodim24.png" , 29613 , 26 .75f , 40 .61f , 59014 , 31 . 522869f },
4239+ { " white_1x1.png" , 189 , 100 .0f , 100 .0f , 189 , 100 . 000000f },
4240+ { " wikipedia.png" , 38961 , 24 .10f , 30 .47f , 69558 , 27 . 630802f },
4241+ { " alpha0.png" , 766 , 100 .0f , 56 .16f , 747 , 100 . 000000f }
42394242};
42404243const uint32_t TOTAL_TEST_FILES = sizeof (g_test_files) / sizeof (g_test_files[0 ]);
42414244
@@ -4246,6 +4249,10 @@ static bool test_mode(command_line_params& opts)
42464249 // TODO: Record min/max/avgs
42474250 // TODO: Add another ETC1S quality level
42484251
4252+ // Minor differences in how floating point code is optimized can result in slightly different generated files.
4253+ const float ETC1S_PSNR_THRESHOLD = .03f ;
4254+ const float ETC1S_FILESIZE_THRESHOLD = .045f ;
4255+
42494256 for (uint32_t i = 0 ; i < TOTAL_TEST_FILES; i++)
42504257 {
42514258 std::string filename (opts.m_test_file_dir );
@@ -4274,35 +4281,73 @@ static bool test_mode(command_line_params& opts)
42744281
42754282 // Test ETC1S
42764283 flags_and_quality = (opts.m_comp_params .m_multithreading ? cFlagThreaded : 0 ) | cFlagPrintStats | cFlagPrintStatus;
4277-
4278- void * pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4279- if (!pData)
4284+
42804285 {
4281- error_printf (" basis_compress() failed!\n " );
4282- return false ;
4283- }
4284- basis_free_data (pData);
4286+ printf (" **** Testing ETC1S non-OpenCL level 1\n " );
4287+
4288+ // Level 1
4289+ void * pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4290+ if (!pData)
4291+ {
4292+ error_printf (" basis_compress() failed!\n " );
4293+ return false ;
4294+ }
4295+ basis_free_data (pData);
42854296
4286- printf (" ETC1S Size: %u, PSNR: %f\n " , (uint32_t )data_size, stats.m_basis_rgba_avg_psnr );
4297+ printf (" ETC1S level 1 Size: %u, PSNR: %f\n " , (uint32_t )data_size, stats.m_basis_rgba_avg_psnr );
42874298
4288- float file_size_ratio = fabs ((data_size / (float )g_test_files[i].m_etc1s_size ) - 1 .0f );
4289- if (file_size_ratio > .015f )
4290- {
4291- error_printf (" Expected ETC1S file size was %u, but got %u instead!\n " , g_test_files[i].m_etc1s_size , (uint32_t )data_size);
4292- total_mismatches++;
4299+ float file_size_ratio = fabs ((data_size / (float )g_test_files[i].m_etc1s_size ) - 1 .0f );
4300+ if (file_size_ratio > ETC1S_FILESIZE_THRESHOLD)
4301+ {
4302+ error_printf (" Expected ETC1S file size was %u, but got %u instead!\n " , g_test_files[i].m_etc1s_size , (uint32_t )data_size);
4303+ total_mismatches++;
4304+ }
4305+
4306+ if (fabs (stats.m_basis_rgba_avg_psnr - g_test_files[i].m_etc1s_psnr ) > ETC1S_PSNR_THRESHOLD)
4307+ {
4308+ error_printf (" Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n " , g_test_files[i].m_etc1s_psnr , stats.m_basis_rgba_avg_psnr );
4309+ total_mismatches++;
4310+ }
42934311 }
42944312
4295- if (fabs (stats.m_basis_rgba_avg_psnr - g_test_files[i].m_etc1s_psnr ) > .02f )
42964313 {
4297- error_printf (" Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n " , g_test_files[i].m_etc1s_psnr , stats.m_basis_rgba_avg_psnr );
4298- total_mismatches++;
4314+ printf (" **** Testing ETC1S non-OpenCL level 128\n " );
4315+
4316+ // Test ETC1S level 128
4317+ flags_and_quality |= 128 ;
4318+
4319+ void * pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4320+ if (!pData)
4321+ {
4322+ error_printf (" basis_compress() failed!\n " );
4323+ return false ;
4324+ }
4325+ basis_free_data (pData);
4326+
4327+ printf (" ETC1S level 128 Size: %u, PSNR: %f\n " , (uint32_t )data_size, stats.m_basis_rgba_avg_psnr );
4328+
4329+ float file_size_ratio = fabs ((data_size / (float )g_test_files[i].m_etc1s_128_size ) - 1 .0f );
4330+ if (file_size_ratio > ETC1S_FILESIZE_THRESHOLD)
4331+ {
4332+ error_printf (" Expected ETC1S file size was %u, but got %u instead!\n " , g_test_files[i].m_etc1s_128_size , (uint32_t )data_size);
4333+ total_mismatches++;
4334+ }
4335+
4336+ if (fabs (stats.m_basis_rgba_avg_psnr - g_test_files[i].m_etc1s_128_psnr ) > ETC1S_PSNR_THRESHOLD)
4337+ {
4338+ error_printf (" Expected ETC1S RGBA Avg PSNR was %f, but got %f instead!\n " , g_test_files[i].m_etc1s_128_psnr , stats.m_basis_rgba_avg_psnr );
4339+ total_mismatches++;
4340+ }
42994341 }
43004342
43014343 if (opencl_is_available ())
43024344 {
4345+ printf (" **** Testing ETC1S OpenCL level 1\n " );
4346+
4347+ // Test ETC1S OpenCL level 1
43034348 flags_and_quality = (opts.m_comp_params .m_multithreading ? cFlagThreaded : 0 ) | cFlagUseOpenCL | cFlagPrintStats | cFlagPrintStatus;
43044349
4305- pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4350+ void * pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
43064351 if (!pData)
43074352 {
43084353 error_printf (" basis_compress() failed!\n " );
@@ -4312,7 +4357,7 @@ static bool test_mode(command_line_params& opts)
43124357
43134358 printf (" ETC1S+OpenCL Size: %u, PSNR: %f\n " , (uint32_t )data_size, stats.m_basis_rgba_avg_psnr );
43144359
4315- file_size_ratio = fabs ((data_size / (float )g_test_files[i].m_etc1s_size ) - 1 .0f );
4360+ float file_size_ratio = fabs ((data_size / (float )g_test_files[i].m_etc1s_size ) - 1 .0f );
43164361 if (file_size_ratio > .04f )
43174362 {
43184363 error_printf (" Expected ETC1S+OpenCL file size was %u, but got %u instead!\n " , g_test_files[i].m_etc1s_size , (uint32_t )data_size);
@@ -4336,22 +4381,26 @@ static bool test_mode(command_line_params& opts)
43364381 }
43374382
43384383 // Test UASTC
4339- flags_and_quality = (opts.m_comp_params .m_multithreading ? cFlagThreaded : 0 ) | cFlagUASTC | cFlagPrintStats | cFlagPrintStatus;
4340-
4341- pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4342- if (!pData)
43434384 {
4344- error_printf (" basis_compress() failed!\n " );
4345- return false ;
4346- }
4347- basis_free_data (pData);
4385+ printf (" **** Testing UASTC\n " );
43484386
4349- printf ( " UASTC Size: %u, PSNR: %f \n " , ( uint32_t )data_size, stats. m_basis_rgba_avg_psnr ) ;
4387+ flags_and_quality = (opts. m_comp_params . m_multithreading ? cFlagThreaded : 0 ) | cFlagUASTC | cFlagPrintStats | cFlagPrintStatus ;
43504388
4351- if (fabs (stats.m_basis_rgba_avg_psnr - g_test_files[i].m_uastc_psnr ) > .005f )
4352- {
4353- error_printf (" Expected UASTC RGBA Avg PSNR was %f, but got %f instead!\n " , g_test_files[i].m_etc1s_psnr , stats.m_basis_rgba_avg_psnr );
4354- total_mismatches++;
4389+ void * pData = basis_compress (source_images, flags_and_quality, uastc_rdo_quality, &data_size, &stats);
4390+ if (!pData)
4391+ {
4392+ error_printf (" basis_compress() failed!\n " );
4393+ return false ;
4394+ }
4395+ basis_free_data (pData);
4396+
4397+ printf (" UASTC Size: %u, PSNR: %f\n " , (uint32_t )data_size, stats.m_basis_rgba_avg_psnr );
4398+
4399+ if (fabs (stats.m_basis_rgba_avg_psnr - g_test_files[i].m_uastc_psnr ) > .005f )
4400+ {
4401+ error_printf (" Expected UASTC RGBA Avg PSNR was %f, but got %f instead!\n " , g_test_files[i].m_etc1s_psnr , stats.m_basis_rgba_avg_psnr );
4402+ total_mismatches++;
4403+ }
43554404 }
43564405 }
43574406
0 commit comments