diff --git a/shared/test/unit_test/xe_hpg_core/test_encode_dispatch_kernel_xe_hpg_core.cpp b/shared/test/unit_test/xe_hpg_core/test_encode_dispatch_kernel_xe_hpg_core.cpp index 7fd5f3915b..df64112460 100644 --- a/shared/test/unit_test/xe_hpg_core/test_encode_dispatch_kernel_xe_hpg_core.cpp +++ b/shared/test/unit_test/xe_hpg_core/test_encode_dispatch_kernel_xe_hpg_core.cpp @@ -6,13 +6,16 @@ */ #include "shared/source/command_container/command_encoder.h" +#include "shared/source/helpers/hw_walk_order.h" #include "shared/source/os_interface/product_helper.h" #include "shared/source/os_interface/product_helper_hw.h" #include "shared/test//common/helpers/raii_product_helper.h" #include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/helpers/variable_backup.h" +#include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_execution_environment.h" #include "shared/test/common/test_macros/hw_test.h" +#include "shared/test/unit_test/fixtures/command_container_fixture.h" #include "hw_cmds_xe_hpg_core_base.h" @@ -60,3 +63,76 @@ HWTEST2_F(CommandEncodeStatesTestXeHpgCore, givenRequiredWorkGroupOrderAndIsAdju EncodeDispatchKernel::adjustWalkOrder(walkerCmd, linearOrder, rootDeviceEnvironment); EXPECT_EQ(WALKER_TYPE::DISPATCH_WALK_ORDER::LINERAR_WALKER, walkerCmd.getDispatchWalkOrder()); } + +using EncodeKernelXeHpgCoreTest = Test; + +XE_HPG_CORETEST_F(EncodeKernelXeHpgCoreTest, givenRequiredWorkGroupOrderWhenCallAdjustWalkOrderThenDispatchWalkOrderIsProgrammedCorrectly) { + using WALKER_TYPE = typename FamilyType::WALKER_TYPE; + + WALKER_TYPE walkerCmd{}; + uint32_t yOrder = 2u; + + auto &productHelper = getHelper(); + auto releaseHelper = getReleaseHelper(); + auto &rootDeviceEnvironment = this->pDevice->getRootDeviceEnvironment(); + auto isExpectedNewWalkOrderApplied = productHelper.isAdjustWalkOrderAvailable(releaseHelper); + + EXPECT_EQ(HwWalkOrderHelper::compatibleDimensionOrders[yOrder], HwWalkOrderHelper::yOrderWalk); + + auto dispatchWalkOrderBeforeAdjust = walkerCmd.getDispatchWalkOrder(); + + uint32_t fakeOrder = 5u; + EncodeDispatchKernel::adjustWalkOrder(walkerCmd, fakeOrder, rootDeviceEnvironment); + EXPECT_EQ(dispatchWalkOrderBeforeAdjust, walkerCmd.getDispatchWalkOrder()); // no change + + EncodeDispatchKernel::adjustWalkOrder(walkerCmd, yOrder, rootDeviceEnvironment); + auto expectedWalkOrder = isExpectedNewWalkOrderApplied ? WALKER_TYPE::DISPATCH_WALK_ORDER::Y_ORDER_WALKER : dispatchWalkOrderBeforeAdjust; + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); + + uint32_t linearOrder = 0u; + EXPECT_EQ(HwWalkOrderHelper::compatibleDimensionOrders[linearOrder], HwWalkOrderHelper::linearWalk); + + EncodeDispatchKernel::adjustWalkOrder(walkerCmd, linearOrder, rootDeviceEnvironment); + expectedWalkOrder = isExpectedNewWalkOrderApplied ? WALKER_TYPE::DISPATCH_WALK_ORDER::LINERAR_WALKER : dispatchWalkOrderBeforeAdjust; + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); +} + +XE_HPG_CORETEST_F(EncodeKernelXeHpgCoreTest, givenRequiredWorkGroupOrderWhenCallEncodeThreadDataThenDispatchWalkOrderIsProgrammedCorrectly) { + using WALKER_TYPE = typename FamilyType::WALKER_TYPE; + WALKER_TYPE walkerCmd = FamilyType::cmdInitGpgpuWalker; + + uint32_t startWorkGroup[3] = {1, 1, 1}; + uint32_t numWorkGroups[3] = {1, 1, 1}; + uint32_t workGroupSizes[3] = {1, 1, 1}; + + auto &productHelper = getHelper(); + auto releaseHelper = getReleaseHelper(); + + auto isExpectedNewWalkOrderApplied = productHelper.isAdjustWalkOrderAvailable(releaseHelper); + auto dispatchWalkOrderBeforeAdjust = walkerCmd.getDispatchWalkOrder(); + auto &rootDeviceEnvironment = this->pDevice->getRootDeviceEnvironment(); + + uint32_t yOrder = 2u; + EXPECT_EQ(HwWalkOrderHelper::compatibleDimensionOrders[yOrder], HwWalkOrderHelper::yOrderWalk); + + auto expectedWalkOrder = isExpectedNewWalkOrderApplied ? WALKER_TYPE::DISPATCH_WALK_ORDER::Y_ORDER_WALKER : dispatchWalkOrderBeforeAdjust; + EncodeDispatchKernel::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3, + 0, 1, false, false, true, yOrder, rootDeviceEnvironment); + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); + + EncodeDispatchKernel::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3, + 0, 1, true, false, true, yOrder, rootDeviceEnvironment); + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); + + uint32_t linearOrder = 0u; + EXPECT_EQ(HwWalkOrderHelper::compatibleDimensionOrders[linearOrder], HwWalkOrderHelper::linearWalk); + + expectedWalkOrder = isExpectedNewWalkOrderApplied ? WALKER_TYPE::DISPATCH_WALK_ORDER::LINERAR_WALKER : dispatchWalkOrderBeforeAdjust; + EncodeDispatchKernel::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3, + 0, 1, false, false, true, linearOrder, rootDeviceEnvironment); + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); + + EncodeDispatchKernel::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3, + 0, 1, true, false, true, linearOrder, rootDeviceEnvironment); + EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder()); +}