@@ -3650,129 +3650,130 @@ tcu::TestStatus CooperativeMatrixTestInstance::iterate(void)
36503650 {
36513651 // Store results as double, which has enough range to hold all the other types exactly.
36523652 double inputA, output;
3653+ tcu::RoundingDirection rd[2 ] = {tcu::ROUND_DOWNWARD, tcu::ROUND_UPWARD};
3654+ double inputAConverted[2 ];
36533655
3654- // This loads the data according to dataTypes[0], and then converts to the template parameter type
3655- switch (dataTypes[3 ])
3656+ for (uint32_t j = 0 ; j < 2 ; ++j)
36563657 {
3657- case VK_COMPONENT_TYPE_UINT8_KHR:
3658- inputA = getDataConvertedToT<uint8_t >(ptrs[0 ], dataTypes[0 ], i);
3659- break ;
3660- case VK_COMPONENT_TYPE_UINT16_KHR:
3661- inputA = getDataConvertedToT<uint16_t >(ptrs[0 ], dataTypes[0 ], i);
3662- break ;
3663- case VK_COMPONENT_TYPE_UINT32_KHR:
3664- inputA = getDataConvertedToT<uint32_t >(ptrs[0 ], dataTypes[0 ], i);
3665- break ;
3666- case VK_COMPONENT_TYPE_SINT8_KHR:
3667- inputA = getDataConvertedToT<int8_t >(ptrs[0 ], dataTypes[0 ], i);
3668- break ;
3669- case VK_COMPONENT_TYPE_SINT16_KHR:
3670- inputA = getDataConvertedToT<int16_t >(ptrs[0 ], dataTypes[0 ], i);
3671- break ;
3672- case VK_COMPONENT_TYPE_SINT32_KHR:
3673- inputA = getDataConvertedToT<int32_t >(ptrs[0 ], dataTypes[0 ], i);
3674- break ;
3675- case VK_COMPONENT_TYPE_FLOAT32_KHR:
3676- case VK_COMPONENT_TYPE_FLOAT_E5M2_NV:
3677- case VK_COMPONENT_TYPE_FLOAT_E4M3_NV:
3678- case VK_COMPONENT_TYPE_FLOAT16_KHR:
3679- inputA = getDataConvertedToT<float >(ptrs[0 ], dataTypes[0 ], i);
3680- break ;
3658+ // This loads the data according to dataTypes[0], and then converts to the template parameter type
3659+ switch (dataTypes[3 ])
3660+ {
3661+ case VK_COMPONENT_TYPE_UINT8_KHR:
3662+ inputA = getDataConvertedToT<uint8_t >(ptrs[0 ], dataTypes[0 ], i);
3663+ break ;
3664+ case VK_COMPONENT_TYPE_UINT16_KHR:
3665+ inputA = getDataConvertedToT<uint16_t >(ptrs[0 ], dataTypes[0 ], i);
3666+ break ;
3667+ case VK_COMPONENT_TYPE_UINT32_KHR:
3668+ inputA = getDataConvertedToT<uint32_t >(ptrs[0 ], dataTypes[0 ], i);
3669+ break ;
3670+ case VK_COMPONENT_TYPE_SINT8_KHR:
3671+ inputA = getDataConvertedToT<int8_t >(ptrs[0 ], dataTypes[0 ], i);
3672+ break ;
3673+ case VK_COMPONENT_TYPE_SINT16_KHR:
3674+ inputA = getDataConvertedToT<int16_t >(ptrs[0 ], dataTypes[0 ], i);
3675+ break ;
3676+ case VK_COMPONENT_TYPE_SINT32_KHR:
3677+ inputA = getDataConvertedToT<int32_t >(ptrs[0 ], dataTypes[0 ], i);
3678+ break ;
3679+ case VK_COMPONENT_TYPE_FLOAT32_KHR:
3680+ case VK_COMPONENT_TYPE_FLOAT_E5M2_NV:
3681+ case VK_COMPONENT_TYPE_FLOAT_E4M3_NV:
3682+ case VK_COMPONENT_TYPE_FLOAT16_KHR:
36813683#ifndef CTS_USES_VULKANSC
3682- case VK_COMPONENT_TYPE_BFLOAT16_KHR:
3683- {
3684- float temp = getDataConvertedToT<float >(ptrs[0 ], dataTypes[0 ], i);
3685- inputA = BFloat16 (temp).asDouble ();
3686- break ;
3687- }
3684+ case VK_COMPONENT_TYPE_BFLOAT16_KHR:
36883685#endif // CTS_USES_VULKANSC
3689- default :
3690- TCU_THROW (InternalError, " Unexpected type" );
3691- }
3686+ inputA = getDataConvertedToT<float >(ptrs[0 ], dataTypes[0 ], i);
3687+ break ;
3688+ default :
3689+ TCU_THROW (InternalError, " Unexpected type" );
3690+ }
36923691
3693- double inputAConverted = inputA;
3692+ inputAConverted[j] = inputA;
36943693
3695- switch (dataTypes[3 ])
3696- {
3697- case VK_COMPONENT_TYPE_UINT8_KHR:
3698- output = getDataConvertedToT<uint8_t >(ptrs[3 ], dataTypes[3 ], i);
3699- break ;
3700- case VK_COMPONENT_TYPE_UINT16_KHR:
3701- output = getDataConvertedToT<uint16_t >(ptrs[3 ], dataTypes[3 ], i);
3702- break ;
3703- case VK_COMPONENT_TYPE_UINT32_KHR:
3704- output = getDataConvertedToT<uint32_t >(ptrs[3 ], dataTypes[3 ], i);
3705- break ;
3706- case VK_COMPONENT_TYPE_SINT8_KHR:
3707- output = getDataConvertedToT<int8_t >(ptrs[3 ], dataTypes[3 ], i);
3708- break ;
3709- case VK_COMPONENT_TYPE_SINT16_KHR:
3710- output = getDataConvertedToT<int16_t >(ptrs[3 ], dataTypes[3 ], i);
3711- break ;
3712- case VK_COMPONENT_TYPE_SINT32_KHR:
3713- output = getDataConvertedToT<int32_t >(ptrs[3 ], dataTypes[3 ], i);
3714- break ;
3715- case VK_COMPONENT_TYPE_FLOAT32_KHR:
3716- output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3717- break ;
3718- case VK_COMPONENT_TYPE_FLOAT16_KHR:
3719- {
3720- output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3721- inputAConverted = tcu::Float16 (inputAConverted).asDouble ();
3722- break ;
3723- }
3724- case VK_COMPONENT_TYPE_FLOAT_E5M2_NV:
3725- {
3726- output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3727- inputAConverted = tcu::FloatE5M2 (inputAConverted).asDouble ();
3728- break ;
3729- }
3730- case VK_COMPONENT_TYPE_FLOAT_E4M3_NV:
3731- {
3732- output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3733- inputAConverted = tcu::FloatE4M3 (inputAConverted).asDouble ();
3734- break ;
3735- }
3736- #ifndef CTS_USES_VULKANSC
3737- case VK_COMPONENT_TYPE_BFLOAT16_KHR:
3738- {
3739- float temp = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3740- output = BFloat16 (temp).asDouble ();
3741- break ;
3742- }
3743- #endif // CTS_USES_VULKANSC
3744- default :
3745- TCU_THROW (InternalError, " Unexpected type" );
3746- }
3747-
3748- if (m_data.testType == TT_CONVERT_SAT)
3749- {
37503694 switch (dataTypes[3 ])
37513695 {
3696+ case VK_COMPONENT_TYPE_UINT8_KHR:
3697+ output = getDataConvertedToT<uint8_t >(ptrs[3 ], dataTypes[3 ], i);
3698+ break ;
3699+ case VK_COMPONENT_TYPE_UINT16_KHR:
3700+ output = getDataConvertedToT<uint16_t >(ptrs[3 ], dataTypes[3 ], i);
3701+ break ;
3702+ case VK_COMPONENT_TYPE_UINT32_KHR:
3703+ output = getDataConvertedToT<uint32_t >(ptrs[3 ], dataTypes[3 ], i);
3704+ break ;
3705+ case VK_COMPONENT_TYPE_SINT8_KHR:
3706+ output = getDataConvertedToT<int8_t >(ptrs[3 ], dataTypes[3 ], i);
3707+ break ;
3708+ case VK_COMPONENT_TYPE_SINT16_KHR:
3709+ output = getDataConvertedToT<int16_t >(ptrs[3 ], dataTypes[3 ], i);
3710+ break ;
3711+ case VK_COMPONENT_TYPE_SINT32_KHR:
3712+ output = getDataConvertedToT<int32_t >(ptrs[3 ], dataTypes[3 ], i);
3713+ break ;
3714+ case VK_COMPONENT_TYPE_FLOAT32_KHR:
3715+ output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3716+ break ;
3717+ case VK_COMPONENT_TYPE_FLOAT16_KHR:
3718+ {
3719+ output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3720+ inputAConverted[j] = tcu::Float16 (inputAConverted[j], rd[j]).asDouble ();
3721+ break ;
3722+ }
37523723 case VK_COMPONENT_TYPE_FLOAT_E5M2_NV:
37533724 {
3754- if (fabs (inputA) > tcu::FloatE5M2::largestNormal (1 ).asFloat ())
3755- {
3756- inputAConverted = tcu::FloatE5M2::largestNormal (inputA > 0 ? 1 : -1 ).asFloat ();
3757- }
3725+ output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3726+ inputAConverted[j] = tcu::FloatE5M2 (inputAConverted[j], rd[j]).asDouble ();
37583727 break ;
37593728 }
37603729 case VK_COMPONENT_TYPE_FLOAT_E4M3_NV:
37613730 {
3762- if (fabs (inputA) > tcu::FloatE4M3::largestNormal (1 ).asFloat ())
3763- {
3764- inputAConverted = tcu::FloatE4M3::largestNormal (inputA > 0 ? 1 : -1 ).asFloat ();
3765- }
3731+ output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3732+ inputAConverted[j] = tcu::FloatE4M3 (inputAConverted[j], rd[j]).asDouble ();
37663733 break ;
37673734 }
3768- default :
3735+ #ifndef CTS_USES_VULKANSC
3736+ case VK_COMPONENT_TYPE_BFLOAT16_KHR:
3737+ {
3738+ output = getDataConvertedToT<float >(ptrs[3 ], dataTypes[3 ], i);
3739+ inputAConverted[j] = BFloat16 (inputAConverted[j], rd[j]).asDouble ();
37693740 break ;
37703741 }
3742+ #endif // CTS_USES_VULKANSC
3743+ default :
3744+ TCU_THROW (InternalError, " Unexpected type" );
3745+ }
3746+
3747+ if (m_data.testType == TT_CONVERT_SAT)
3748+ {
3749+ switch (dataTypes[3 ])
3750+ {
3751+ case VK_COMPONENT_TYPE_FLOAT_E5M2_NV:
3752+ {
3753+ if (fabs (inputA) > tcu::FloatE5M2::largestNormal (1 ).asFloat ())
3754+ {
3755+ inputAConverted[j] = tcu::FloatE5M2::largestNormal (inputA > 0 ? 1 : -1 ).asFloat ();
3756+ }
3757+ break ;
3758+ }
3759+ case VK_COMPONENT_TYPE_FLOAT_E4M3_NV:
3760+ {
3761+ if (fabs (inputA) > tcu::FloatE4M3::largestNormal (1 ).asFloat ())
3762+ {
3763+ inputAConverted[j] = tcu::FloatE4M3::largestNormal (inputA > 0 ? 1 : -1 ).asFloat ();
3764+ }
3765+ break ;
3766+ }
3767+ default :
3768+ break ;
3769+ }
3770+ }
37713771 }
37723772
3773- if (inputAConverted != output && !(std::isnan (inputAConverted) && std::isnan (output)))
3773+ if (inputAConverted[0 ] != output && inputAConverted[1 ] != output &&
3774+ !((std::isnan (inputAConverted[0 ]) || std::isnan (inputAConverted[1 ])) && std::isnan (output)))
37743775 {
3775- // printf("i %d inputA %f inputAConverted %f output %f\n", i, inputA, inputAConverted, output);
3776+ // printf("i %d inputA %f inputAConverted[RD] %f inputAConverted[RU] %f output %f\n", i, inputA, inputAConverted[0], inputAConverted[1] , output);
37763777 res = QP_TEST_RESULT_FAIL;
37773778 break ;
37783779 }
0 commit comments