diff --git a/src/OpenColorIO/CMakeLists.txt b/src/OpenColorIO/CMakeLists.txt index 857058696c..7d2894da6b 100755 --- a/src/OpenColorIO/CMakeLists.txt +++ b/src/OpenColorIO/CMakeLists.txt @@ -220,16 +220,6 @@ if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) set_property(SOURCE ops/lut3d/Lut3DOpCPU_AVX.cpp APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX_ARGS}) set_property(SOURCE ops/lut3d/Lut3DOpCPU_AVX2.cpp APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX2_ARGS}) set_property(SOURCE ops/lut3d/Lut3DOpCPU_AVX512.cpp APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX512_ARGS}) - set_property(SOURCE ops/fixedfunction/ACES2/Transform.cpp APPEND PROPERTY COMPILE_OPTIONS ${OCIO_SSE2_ARGS} ${OCIO_AVX_ARGS}) -endif() - -# TODO: What to do for other compilers? -if(USE_GCC) - set_property(SOURCE ops/fixedfunction/ACES2/Transform.cpp APPEND PROPERTY COMPILE_OPTIONS - -fno-math-errno -fno-signed-zeros -fno-trapping-math -fno-signaling-nans -ffinite-math-only -freciprocal-math -ftree-vectorize) -endif() -if(MSVC) - set_property(SOURCE ops/fixedfunction/ACES2/Transform.cpp APPEND PROPERTY COMPILE_OPTIONS /Qvec) endif() configure_file(CPUInfoConfig.h.in CPUInfoConfig.h) diff --git a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp index 14461ce8fa..f72526f961 100644 --- a/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp +++ b/src/OpenColorIO/ops/fixedfunction/ACES2/Transform.cpp @@ -8,8 +8,18 @@ #include #include +// Disabling SIMD for now to do scalar math verification. +// FIXME: Re-enable SIMD and verify SIMD math is correct. +#undef OCIO_USE_SSE2 +#undef OCIO_USE_AVX + +#if OCIO_USE_SSE2 #include "SSE2.h" +#endif + +#if OCIO_USE_AVX #include "AVX.h" +#endif namespace OCIO_NAMESPACE { diff --git a/tests/cpu/CMakeLists.txt b/tests/cpu/CMakeLists.txt index 7dd684659d..66c32cb8a7 100755 --- a/tests/cpu/CMakeLists.txt +++ b/tests/cpu/CMakeLists.txt @@ -343,7 +343,6 @@ if(OCIO_USE_SIMD AND (OCIO_ARCH_X86 OR OCIO_USE_SSE2NEON)) set_property(SOURCE "${CMAKE_SOURCE_DIR}/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX_ARGS}) set_property(SOURCE "${CMAKE_SOURCE_DIR}/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX2.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX2_ARGS}) set_property(SOURCE "${CMAKE_SOURCE_DIR}/src/OpenColorIO/ops/lut3d/Lut3DOpCPU_AVX512.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX512_ARGS}) - set_property(SOURCE "${CMAKE_SOURCE_DIR}/ops/fixedfunction/ACES2/Transform.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_SSE2_ARGS} ${OCIO_AVX_ARGS}) set_property(SOURCE "SSE2_tests.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_SSE2_ARGS}) set_property(SOURCE "AVX_tests.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX_ARGS}) set_property(SOURCE "AVX2_tests.cpp" APPEND PROPERTY COMPILE_OPTIONS ${OCIO_AVX2_ARGS}) diff --git a/tests/cpu/UnitTestUtils.h b/tests/cpu/UnitTestUtils.h index bbdac35549..315cf258ee 100644 --- a/tests/cpu/UnitTestUtils.h +++ b/tests/cpu/UnitTestUtils.h @@ -79,7 +79,8 @@ template inline bool EqualWithSafeRelError(T value, T expected, T eps, - T minExpected) + T minExpected, + T* computedError = nullptr) { // If value and expected are infinity, return true. if (value == expected) return true; @@ -88,9 +89,14 @@ inline bool EqualWithSafeRelError(T value, ((expected < minExpected) ? minExpected : expected) : ((-expected < minExpected) ? minExpected : -expected); - return ( - ((value > expected) ? value - expected : expected - value) - / div) <= eps; + T err = ((value > expected) ? value - expected : expected - value) / div; + + if (computedError) + { + *computedError = err; + } + + return (err <= eps); } // C++20 introduces new strongly typed, UTF-8 based, char8_t and u8string types diff --git a/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp b/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp index 1aa7dbc463..bd8536f33a 100644 --- a/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp +++ b/tests/cpu/ops/fixedfunction/FixedFunctionOpCPU_tests.cpp @@ -33,17 +33,22 @@ void ApplyFixedFunction(float * input_32f, // Using rel error with a large minExpected value of 1 will transition // from absolute error for expected values < 1 and // relative error for values > 1. + float computedError = 0.0f; const bool equalRel = OCIO::EqualWithSafeRelError(input_32f[idx], expected_32f[idx], errorThreshold, - 1.0f); + 1.0f, + &computedError); if (!equalRel) { std::ostringstream errorMsg; errorMsg.precision(14); errorMsg << "Index: " << idx; errorMsg << " - Values: " << input_32f[idx] << " expected: " << expected_32f[idx]; - errorMsg << " - Threshold: " << errorThreshold; + errorMsg << " - Error: " << computedError << " (" + << std::setprecision(3) << computedError / errorThreshold; + errorMsg << "x of Threshold: " + << std::setprecision(6) << errorThreshold << ")"; OCIO_CHECK_ASSERT_MESSAGE_FROM(0, errorMsg.str(), lineNo); } } @@ -462,45 +467,45 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_output_transform_20) const float expected_32f[num_samples*4] = { // ACEScg primaries and secondaries scaled by 4 - 4.965774059f, -0.032864563f, 0.041625995f, 1.0f, - 3.969441891f, 3.825784922f, -0.056133576f, 1.0f, - -0.075329021f, 3.688980103f, 0.270296901f, 1.0f, - -0.095423937f, 3.650517225f, 3.459972620f, 1.0f, - -0.028930068f, 0.196428135f, 2.796343565f, 1.0f, - 4.900805950f, -0.064376131f, 3.838256121f, 1.0f, + 4.966040611f, -0.032990534f, 0.041587759f, 1.0f, + 3.969455719f, 3.825795889f, -0.056159109f, 1.0f, + -0.075445443f, 3.689064741f, 0.270243138f, 1.0f, + -0.095422804f, 3.650515079f, 3.459970713f, 1.0f, + -0.029242843f, 0.196083903f, 2.797096968f, 1.0f, + 4.900825977f, -0.064415932f, 3.838272572f, 1.0f, // OCIO test values - 0.096890204f, -0.001135312f, 0.018971510f, 0.5f, - 0.809614301f, 0.479856580f, 0.814239502f, 1.0f, - 0.107420206f, 0.920529068f, 0.726378500f, 0.0f, + 0.096831776f, -0.001114858f, 0.018976377f, 0.5f, + 0.811647296f, 0.478211939f, 0.816507518f, 1.0f, + 0.110244252f, 0.919241786f, 0.726084292f, 0.0f, // ColorChecker24 (SMPTE 2065-1 2021) - 0.115475260f, 0.050812904f, 0.030212952f, 1.0f, - 0.484879673f, 0.301042974f, 0.226768956f, 1.0f, - 0.098463766f, 0.160814658f, 0.277010560f, 1.0f, - 0.071130365f, 0.107334383f, 0.035097566f, 1.0f, - 0.207111493f, 0.198474824f, 0.375326216f, 1.0f, - 0.195447892f, 0.481111974f, 0.393299013f, 1.0f, - 0.571913838f, 0.196872935f, 0.041634772f, 1.0f, - 0.045791931f, 0.069875360f, 0.291233480f, 1.0f, - 0.424848706f, 0.083199009f, 0.102153838f, 1.0f, - 0.059589427f, 0.022219172f, 0.091246888f, 1.0f, - 0.360365510f, 0.478741467f, 0.086726837f, 1.0f, - 0.695662081f, 0.371994525f, 0.068298168f, 1.0f, - 0.011806309f, 0.021665439f, 0.199594811f, 1.0f, - 0.076526314f, 0.256237417f, 0.060564656f, 1.0f, - 0.300064564f, 0.023416257f, 0.030360471f, 1.0f, - 0.805484772f, 0.596903503f, 0.082996152f, 1.0f, - 0.388385952f, 0.079899102f, 0.245819211f, 1.0f, - 0.010952532f, 0.196105912f, 0.307181358f, 1.0f, - 0.921019495f, 0.921707213f, 0.912856042f, 1.0f, - 0.590192318f, 0.588423848f, 0.587825358f, 1.0f, - 0.337743521f, 0.337685764f, 0.338155121f, 1.0f, - 0.169265985f, 0.169178501f, 0.169557109f, 1.0f, - 0.058346048f, 0.059387825f, 0.060296260f, 1.0f, - 0.012581184f, 0.012947139f, 0.013654195f, 1.0f, + 0.115581684f, 0.050785132f, 0.030158322f, 1.0f, + 0.482630610f, 0.301559567f, 0.228200614f, 1.0f, + 0.097509719f, 0.160682827f, 0.278755993f, 1.0f, + 0.071118668f, 0.107350536f, 0.035066456f, 1.0f, + 0.206827119f, 0.198065758f, 0.376981646f, 1.0f, + 0.197157621f, 0.480333209f, 0.393290222f, 1.0f, + 0.570664287f, 0.197219044f, 0.042163782f, 1.0f, + 0.045591675f, 0.069720201f, 0.292005479f, 1.0f, + 0.425108939f, 0.083108872f, 0.102091998f, 1.0f, + 0.059560396f, 0.022268835f, 0.091132581f, 1.0f, + 0.360384226f, 0.478674322f, 0.086890966f, 1.0f, + 0.691989481f, 0.372686356f, 0.070826821f, 1.0f, + 0.012042155f, 0.021904279f, 0.198501319f, 1.0f, + 0.076645926f, 0.256147027f, 0.060666814f, 1.0f, + 0.300039411f, 0.023424838f, 0.030365985f, 1.0f, + 0.803476214f, 0.596933603f, 0.085341305f, 1.0f, + 0.388712883f, 0.079724148f, 0.245922253f, 1.0f, + 0.011061139f, 0.196086824f, 0.307065904f, 1.0f, + 0.921007156f, 0.921683431f, 0.912948132f, 1.0f, + 0.590166390f, 0.588430583f, 0.587841213f, 1.0f, + 0.337742388f, 0.337684810f, 0.338159621f, 1.0f, + 0.169266224f, 0.169178173f, 0.169558540f, 1.0f, + 0.058399219f, 0.059382606f, 0.060239695f, 1.0f, + 0.012618840f, 0.012950940f, 0.013591323f, 1.0f, // Spectrally non-selective 18 % reflecting diffuser - 0.145115465f, 0.145115525f, 0.145115510f, 1.0f, + 0.145115077f, 0.145115703f, 0.145115480f, 1.0f, // Perfect reflecting diffuser - 1.041565657f, 1.041566014f, 1.041565657f, 1.0f, + 1.041565537f, 1.041566610f, 1.041566253f, 1.0f, }; OCIO::FixedFunctionOpData::Params params = { @@ -518,6 +523,17 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_output_transform_20) 1e-5f, __LINE__); +#if DUMP_RESULT + std::cout << "Results: \n" << std::setprecision(9) << std::fixed; + for (unsigned i = 0; i < num_samples; ++i) + { + std::cout << input2_32f[i * 4 + 0] << "f, " + << input2_32f[i * 4 + 1] << "f, " + << input2_32f[i * 4 + 2] << "f, " + << input2_32f[i * 4 + 3] << "f,\n"; + } +#endif + OCIO::ConstFixedFunctionOpDataRcPtr funcData2 = std::make_shared(OCIO::FixedFunctionOpData::ACES_OUTPUT_TRANSFORM_20_INV, params); @@ -778,35 +794,35 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_tonescale_compress_20) const float expected_32f[num_samples*4] = { // ACEScg primaries and secondaries scaled by 4 - 110.702453613f, 211.251770020f, 25.025110245f, 1.0f, - 168.016815186f, 129.796249390f, 106.183448792f, 1.0f, - 140.814849854f, 193.459213257f, 147.056488037f, 1.0f, - 156.429519653f, 110.938514709f, 192.204727173f, 1.0f, - 80.456542969f, 98.490524292f, 268.442108154f, 1.0f, - 135.172195435f, 175.559280396f, 341.715240479f, 1.0f, + 110.702453613f, 211.242279053f, 25.025110245f, 1.0f, + 168.016815186f, 129.795593262f, 106.183448792f, 1.0f, + 140.814849854f, 193.450653076f, 147.056488037f, 1.0f, + 156.429504395f, 110.935348511f, 192.204727173f, 1.0f, + 80.456558228f, 98.743263245f, 268.442108154f, 1.0f, + 135.172225952f, 175.572814941f, 341.715240479f, 1.0f, // OCIO test values - 18.187314987f, 33.819175720f, 4.173158169f, 0.5f, - 80.413116455f, 21.309329987f, 332.159759521f, 1.0f, - 83.447891235f, 37.852291107f, 182.925750732f, 0.0f, + 18.187316895f, 33.767055511f, 4.173158169f, 0.5f, + 80.413101196f, 21.547714233f, 332.159759521f, 1.0f, + 83.447883606f, 37.597621918f, 182.925750732f, 0.0f, // ColorChecker24 (SMPTE 2065-1 2021) - 27.411964417f, 13.382769585f, 38.146659851f, 1.0f, - 59.987670898f, 14.391894341f, 39.841842651f, 1.0f, - 43.298923492f, 12.199877739f, 249.107116699f, 1.0f, - 31.489658356f, 14.075142860f, 128.878036499f, 1.0f, - 50.749198914f, 12.731814384f, 285.658966064f, 1.0f, - 64.728637695f, 18.593795776f, 179.324264526f, 1.0f, - 53.399448395f, 37.394428253f, 50.924011230f, 1.0f, - 34.719596863f, 21.616765976f, 271.008331299f, 1.0f, - 43.910713196f, 36.788166046f, 13.975610733f, 1.0f, - 23.196525574f, 15.118354797f, 317.544281006f, 1.0f, - 63.348674774f, 33.283493042f, 119.145133972f, 1.0f, - 64.908889771f, 35.371044159f, 70.842193604f, 1.0f, - 24.876911163f, 23.143159866f, 273.228973389f, 1.0f, - 44.203376770f, 28.918329239f, 144.154159546f, 1.0f, - 32.824356079f, 43.447875977f, 17.892261505f, 1.0f, - 75.830871582f, 39.872474670f, 90.752044678f, 1.0f, - 45.823116302f, 34.652069092f, 348.832092285f, 1.0f, - 43.597240448f, 23.079078674f, 218.454376221f, 1.0f, + 27.411968231f, 13.410449982f, 38.146659851f, 1.0f, + 59.987659454f, 14.175936699f, 39.841842651f, 1.0f, + 43.298923492f, 12.367712021f, 249.107116699f, 1.0f, + 31.489654541f, 14.086299896f, 128.878036499f, 1.0f, + 50.749198914f, 12.862657547f, 285.658966064f, 1.0f, + 64.728637695f, 18.433788300f, 179.324264526f, 1.0f, + 53.399444580f, 37.239288330f, 50.924011230f, 1.0f, + 34.719596863f, 21.685737610f, 271.008331299f, 1.0f, + 43.910709381f, 36.826980591f, 13.975610733f, 1.0f, + 23.196529388f, 15.087531090f, 317.544281006f, 1.0f, + 63.348682404f, 33.255519867f, 119.145133972f, 1.0f, + 64.908874512f, 34.922687531f, 70.842193604f, 1.0f, + 24.876913071f, 23.019479752f, 273.228973389f, 1.0f, + 44.203376770f, 28.884298325f, 144.154159546f, 1.0f, + 32.824359894f, 43.442367554f, 17.892261505f, 1.0f, + 75.830871582f, 39.538505554f, 90.752044678f, 1.0f, + 45.823120117f, 34.710170746f, 348.832092285f, 1.0f, + 43.597236633f, 23.048465729f, 218.454376221f, 1.0f, }; OCIO::FixedFunctionOpData::Params params = {1000.f}; @@ -819,6 +835,17 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_tonescale_compress_20) 1e-5f, __LINE__); +#if DUMP_RESULTS + std::cout << "Results: \n" << std::setprecision(9) << std::fixed; + for (unsigned i = 0; i < num_samples; ++i) + { + std::cout << input2_32f[i * 4 + 0] << "f, " + << input2_32f[i * 4 + 1] << "f, " + << input2_32f[i * 4 + 2] << "f, " + << input2_32f[i * 4 + 3] << "f,\n"; + } +#endif + OCIO::ConstFixedFunctionOpDataRcPtr funcData2 = std::make_shared(OCIO::FixedFunctionOpData::ACES_TONESCALE_COMPRESS_20_INV, params); @@ -871,35 +898,35 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_gamut_map_20) const float expected_32f[num_samples*4] = { // ACEScg primaries and secondaries scaled by 4 - 107.831291199f, 174.252944946f, 25.025119781f, 1.0f, - 168.028198242f, 118.224960327f, 106.183464050f, 1.0f, - 140.030105591f, 127.177192688f, 147.056488037f, 1.0f, - 156.512435913f, 73.218856812f, 192.204727173f, 1.0f, - 79.378631592f, 72.613555908f, 268.442108154f, 1.0f, - 133.827835083f, 149.929809570f, 341.715240479f, 1.0f, + 107.829742432f, 174.270156860f, 25.025110245f, 1.0f, + 168.028274536f, 118.227561951f, 106.183448792f, 1.0f, + 140.030166626f, 127.184478760f, 147.056488037f, 1.0f, + 156.512435913f, 73.219184875f, 192.204727173f, 1.0f, + 79.378555298f, 72.608604431f, 268.442108154f, 1.0f, + 133.827941895f, 149.930618286f, 341.715240479f, 1.0f, // OCIO test values - 18.194000244f, 33.312938690f, 4.173166752f, 0.5f, - 80.413116455f, 21.309329987f, 332.159759521f, 1.0f, - 83.467437744f, 37.305160522f, 182.925750732f, 0.0f, + 18.193992615f, 33.313068390f, 4.173158169f, 0.5f, + 80.413116455f, 21.309329987f, 332.159759521f, 1.0f, + 83.467445374f, 37.305030823f, 182.925750732f, 0.0f, // ColorChecker24 (SMPTE 2065-1 2021) - 27.411962509f, 13.382793427f, 38.146591187f, 1.0f, - 59.987670898f, 14.391893387f, 39.841842651f, 1.0f, - 43.298923492f, 12.199877739f, 249.107116699f, 1.0f, - 31.489658356f, 14.075142860f, 128.878036499f, 1.0f, - 50.749198914f, 12.731814384f, 285.658966064f, 1.0f, - 64.728637695f, 18.593795776f, 179.324264526f, 1.0f, - 53.399448395f, 37.394428253f, 50.924011230f, 1.0f, - 34.719596863f, 21.616765976f, 271.008331299f, 1.0f, - 43.910709381f, 36.788166046f, 13.975610733f, 1.0f, - 23.196525574f, 15.118361473f, 317.544250488f, 1.0f, - 63.348674774f, 33.283493042f, 119.145133972f, 1.0f, - 64.908889771f, 35.371044159f, 70.842193604f, 1.0f, - 24.876916885f, 23.143167496f, 273.229034424f, 1.0f, - 44.203376770f, 28.918329239f, 144.154159546f, 1.0f, - 32.824352264f, 43.447864532f, 17.892255783f, 1.0f, - 75.830871582f, 39.872474670f, 90.752044678f, 1.0f, - 45.823104858f, 34.652038574f, 348.832092285f, 1.0f, - 43.635551453f, 21.629474640f, 218.454376221f, 1.0f, + 27.411962509f, 13.382769585f, 38.146659851f, 1.0f, + 59.987674713f, 14.391894341f, 39.841842651f, 1.0f, + 43.298919678f, 12.199877739f, 249.107116699f, 1.0f, + 31.489658356f, 14.075142860f, 128.878036499f, 1.0f, + 50.749198914f, 12.731814384f, 285.658966064f, 1.0f, + 64.728637695f, 18.593795776f, 179.324264526f, 1.0f, + 53.399448395f, 37.394428253f, 50.924011230f, 1.0f, + 34.719596863f, 21.616765976f, 271.008331299f, 1.0f, + 43.910713196f, 36.788166046f, 13.975610733f, 1.0f, + 23.196525574f, 15.118354797f, 317.544281006f, 1.0f, + 63.348674774f, 33.283493042f, 119.145133972f, 1.0f, + 64.908882141f, 35.371044159f, 70.842193604f, 1.0f, + 24.876911163f, 23.143159866f, 273.228973389f, 1.0f, + 44.203376770f, 28.918329239f, 144.154159546f, 1.0f, + 32.824356079f, 43.447875977f, 17.892261505f, 1.0f, + 75.830871582f, 39.872474670f, 90.752044678f, 1.0f, + 45.823112488f, 34.652069092f, 348.832092285f, 1.0f, + 43.635547638f, 21.629518509f, 218.454376221f, 1.0f, }; OCIO::FixedFunctionOpData::Params params = { @@ -916,6 +943,16 @@ OCIO_ADD_TEST(FixedFunctionOpCPU, aces_gamut_map_20) funcData, 1e-5f, __LINE__); +#if DUMP_RESULTS + std::cout << "Results: \n" << std::setprecision(9) << std::fixed; + for (unsigned i = 0; i < num_samples; ++i) + { + std::cout << input2_32f[i * 4 + 0] << "f, " + << input2_32f[i * 4 + 1] << "f, " + << input2_32f[i * 4 + 2] << "f, " + << input2_32f[i * 4 + 3] << "f,\n"; + } +#endif OCIO::ConstFixedFunctionOpDataRcPtr funcData2 = std::make_shared(OCIO::FixedFunctionOpData::ACES_GAMUT_COMPRESS_20_INV, diff --git a/tests/cpu/transforms/BuiltinTransform_tests.cpp b/tests/cpu/transforms/BuiltinTransform_tests.cpp index e46bd74fe6..5ffd0ce06b 100644 --- a/tests/cpu/transforms/BuiltinTransform_tests.cpp +++ b/tests/cpu/transforms/BuiltinTransform_tests.cpp @@ -124,7 +124,8 @@ void ValidateValues(const char * prefixMsg, T in, T out, T errorThreshold, int l // Using rel error with a large minExpected value of 1 will transition // from absolute error for expected values < 1 and // relative error for values > 1. - if (!OCIO::EqualWithSafeRelError(in, out, errorThreshold, T(1.))) + T computedError{}; + if (!OCIO::EqualWithSafeRelError(in, out, errorThreshold, T(1.), &computedError)) { std::ostringstream errorMsg; errorMsg.precision(std::numeric_limits::max_digits10); @@ -132,7 +133,11 @@ void ValidateValues(const char * prefixMsg, T in, T out, T errorThreshold, int l { errorMsg << prefixMsg << ": "; } - errorMsg << "value = " << in << " but expected = " << out; + errorMsg << " - Values: " << in << " expected: " << out; + errorMsg << " - Error: " << computedError << " (" + << std::setprecision(3) << computedError / errorThreshold; + errorMsg << "x of Threshold: " << std::setprecision(6) << errorThreshold + << ")"; OCIO_CHECK_ASSERT_MESSAGE_FROM(0, errorMsg.str(), lineNo); } } @@ -328,7 +333,7 @@ namespace using Values = std::vector; using AllValues = std::map>; -void ValidateBuiltinTransform(const char * style, const Values & in, const Values & out, float errorThreshold, int lineNo) +void ValidateBuiltinTransform(const char * style, const Values & in, const Values & out, float errorThreshold, int lineNo, Values &results) { OCIO::BuiltinTransformRcPtr builtin = OCIO::BuiltinTransform::Create(); OCIO_CHECK_NO_THROW_FROM(builtin->setStyle(style), lineNo); @@ -348,16 +353,16 @@ void ValidateBuiltinTransform(const char * style, const Values & in, const Value OCIO::PackedImageDesc inDesc((void *)&in[0], long(in.size() / 3), 1, 3); - Values vals(in.size(), -1.0f); - OCIO::PackedImageDesc outDesc((void *)&vals[0], long(vals.size() / 3), 1, 3); + results = Values(in.size(), -1.0f); + OCIO::PackedImageDesc outDesc((void *)&results[0], long(results.size() / 3), 1, 3); OCIO_CHECK_NO_THROW_FROM(cpu->apply(inDesc, outDesc), lineNo); for (size_t idx = 0; idx < out.size(); ++idx) { std::ostringstream oss; - oss << style << ": for index = " << idx << " with threshold = " << errorThreshold; - ValidateValues(oss.str().c_str(), vals[idx], out[idx], errorThreshold, lineNo); + oss << style << ": for index = " << idx; + ValidateValues(oss.str().c_str(), results[idx], out[idx], errorThreshold, lineNo); } } @@ -458,100 +463,99 @@ AllValues UnitTestValues { 1.0e-6f, { 0.5f, 0.4f, 0.3f }, { 0.22214814f, 0.21179835f, 0.15639816f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.26260212f, 0.25207470f, 0.20617338f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.26260212f, 0.25207472f, 0.20617332f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.16253406f, 0.15513624f, 0.12449740f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.20592399f, 0.19440515f, 0.15028581f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.41039306f, 0.38813826f, 0.30191866f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.46536570f, 0.43852836f, 0.33688113f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.51225936f, 0.48264506f, 0.37060050f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.55653524f, 0.51967940f, 0.38678724f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.41039258f, 0.38813800f, 0.30191845f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.46536540f, 0.43852820f, 0.33688095f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.51225930f, 0.48264477f, 0.37060022f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.55653550f, 0.51967950f, 0.38678730f } } }, - - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC709-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.25147703f, 0.24029444f, 0.18221131f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.25373828f, 0.24245512f, 0.18384966f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.25712878f, 0.24569483f, 0.18630630f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.25373834f, 0.24245517f, 0.18384990f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-XYZ-E_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.26332240f, 0.25161302f, 0.19079340f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.15705064f, 0.14920068f, 0.11100890f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D60-in-XYZ-E_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.20469205f, 0.19229384f, 0.13782679f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.39655724f, 0.37322620f, 0.26917280f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.44968104f, 0.42165324f, 0.30032730f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.49499428f, 0.46407104f, 0.33038715f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-P3-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.53778990f, 0.49960223f, 0.34477120f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.40185606f, 0.37821326f, 0.27276948f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.45568960f, 0.42728746f, 0.30434040f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.50160843f, 0.47027197f, 0.33480182f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.54497580f, 0.50627790f, 0.34937808f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.40185624f, 0.37821335f, 0.27276933f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.45568994f, 0.42728750f, 0.30434027f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.50160870f, 0.47027220f, 0.33480210f } } }, - { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020-D60-in-REC2020-D65_2.0", - { 1.0e-6f, - { 0.5f, 0.4f, 0.3f }, { 0.54497580f, 0.50627780f, 0.34937814f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.26216024f, 0.25204185f, 0.20722267f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.26216024f, 0.25204197f, 0.20722273f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.16215305f, 0.15510881f, 0.12539130f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.20546328f, 0.19437392f, 0.15134005f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.40945035f, 0.38807374f, 0.30408621f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.46440443f, 0.43846416f, 0.33907151f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.51138031f, 0.48258632f, 0.37260318f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.55570847f, 0.51962745f, 0.38863316f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.40945050f, 0.38807371f, 0.30408630f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.46440458f, 0.43846416f, 0.33907148f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.51138067f, 0.48258659f, 0.37260354f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.55570871f, 0.51962751f, 0.38863319f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC709-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.25105247f, 0.24027000f, 0.18314247f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.25330988f, 0.24243048f, 0.18478924f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-REC709-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.25669453f, 0.24566977f, 0.18725836f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.25331008f, 0.24243063f, 0.18478930f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - SDR-100nit-P3-D60-in-XYZ-E_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.26287800f, 0.25158763f, 0.19176911f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-108nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.15668137f, 0.14918011f, 0.11180915f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-300nit-P3-D60-in-XYZ-E_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.20423311f, 0.19227016f, 0.13879779f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.39564425f, 0.37317851f, 0.27111340f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.44875023f, 0.42160600f, 0.30228844f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.49414319f, 0.46402797f, 0.33218032f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-P3-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.53698927f, 0.49956405f, 0.34642375f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-P3-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.40093076f, 0.37816489f, 0.27473599f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-P3-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.45474637f, 0.42723945f, 0.30632755f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-P3-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.50074583f, 0.47022825f, 0.33661887f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-P3-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.54416442f, 0.50623918f, 0.35105261f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-500nit-REC2020-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.40093106f, 0.37816498f, 0.27473608f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-1000nit-REC2020-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.45474690f, 0.42723969f, 0.30632779f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-2000nit-REC2020-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.50074631f, 0.47022864f, 0.33661926f } } }, + { "ACES-OUTPUT - ACES2065-1_to_CIE-XYZ-D65 - HDR-4000nit-REC2020-D60-in-REC2020-D65_2.0", + { 1.0e-4f, + { 0.5f, 0.4f, 0.3f }, { 0.54416472f, 0.50623930f, 0.35105285f } } }, { "APPLE_LOG_to_ACES2065-1", { 1.0e-6f, @@ -669,6 +673,10 @@ OCIO_ADD_TEST(Builtins, validate) { OCIO::ConstBuiltinTransformRegistryRcPtr reg = OCIO::BuiltinTransformRegistry::Get(); +#if DUMP_RESULTS + std::ostringstream ss; +#endif + for (size_t index = 0; index < reg->getNumBuiltins(); ++index) { const char * name = reg->getBuiltinStyle(index); @@ -696,10 +704,35 @@ OCIO_ADD_TEST(Builtins, validate) } else { - ValidateBuiltinTransform(name, std::get<1>(values), std::get<2>(values), std::get<0>(values), __LINE__); + Values results; + ValidateBuiltinTransform(name, std::get<1>(values), std::get<2>(values), std::get<0>(values), __LINE__, results); + +#if DUMP_RESULTS + ss << std::defaultfloat; + ss << " { \"" << name << "\",\n"; + ss << " { " << std::get<0>(values) << "f,\n { "; + int comma = 0; + for (auto val : std::get<1>(values)) + { + ss << (comma++ ? ", " : "") << val << "f"; + comma = true; + } + ss << " },\n { "; + ss << std::setprecision(8) << std::fixed; + comma = 0; + for (auto val : results) + { + ss << (comma++ ? ", " : "") << val << "f"; + } + ss << " } } },\n "; +#endif } } +#if DUMP_RESULTS + std::cout << ss.str() << std::endl; +#endif + // The above checks if a test values is missing, but not if there are test values // that don't have an associated built-in. OCIO_CHECK_EQUAL(UnitTestValues.size(), reg->getNumBuiltins());