Skip to content

Commit bc31d6a

Browse files
committed
Adding more ETC1S testing code. -test now validates ETC1S level 128, in addition to the previous level 1. Tested with MSVC 2019, gcc and clang so far.
1 parent 3f14dea commit bc31d6a

File tree

1 file changed

+108
-59
lines changed

1 file changed

+108
-59
lines changed

basisu_tool.cpp

Lines changed: 108 additions & 59 deletions
Original file line numberDiff line numberDiff line change
@@ -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
};
42404243
const 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

Comments
 (0)