test: add unit tests for command encoder xe hpg

Related-To: NEO-8187

Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski 2023-08-31 10:40:21 +00:00 committed by Compute-Runtime-Automation
parent 4f4d2979cf
commit 4bd992b108
1 changed files with 76 additions and 0 deletions

View File

@ -6,13 +6,16 @@
*/ */
#include "shared/source/command_container/command_encoder.h" #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.h"
#include "shared/source/os_interface/product_helper_hw.h" #include "shared/source/os_interface/product_helper_hw.h"
#include "shared/test//common/helpers/raii_product_helper.h" #include "shared/test//common/helpers/raii_product_helper.h"
#include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/helpers/default_hw_info.h"
#include "shared/test/common/helpers/variable_backup.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/mocks/mock_execution_environment.h"
#include "shared/test/common/test_macros/hw_test.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" #include "hw_cmds_xe_hpg_core_base.h"
@ -60,3 +63,76 @@ HWTEST2_F(CommandEncodeStatesTestXeHpgCore, givenRequiredWorkGroupOrderAndIsAdju
EncodeDispatchKernel<FamilyType>::adjustWalkOrder(walkerCmd, linearOrder, rootDeviceEnvironment); EncodeDispatchKernel<FamilyType>::adjustWalkOrder(walkerCmd, linearOrder, rootDeviceEnvironment);
EXPECT_EQ(WALKER_TYPE::DISPATCH_WALK_ORDER::LINERAR_WALKER, walkerCmd.getDispatchWalkOrder()); EXPECT_EQ(WALKER_TYPE::DISPATCH_WALK_ORDER::LINERAR_WALKER, walkerCmd.getDispatchWalkOrder());
} }
using EncodeKernelXeHpgCoreTest = Test<CommandEncodeStatesFixture>;
XE_HPG_CORETEST_F(EncodeKernelXeHpgCoreTest, givenRequiredWorkGroupOrderWhenCallAdjustWalkOrderThenDispatchWalkOrderIsProgrammedCorrectly) {
using WALKER_TYPE = typename FamilyType::WALKER_TYPE;
WALKER_TYPE walkerCmd{};
uint32_t yOrder = 2u;
auto &productHelper = getHelper<ProductHelper>();
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<FamilyType>::adjustWalkOrder(walkerCmd, fakeOrder, rootDeviceEnvironment);
EXPECT_EQ(dispatchWalkOrderBeforeAdjust, walkerCmd.getDispatchWalkOrder()); // no change
EncodeDispatchKernel<FamilyType>::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<FamilyType>::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<ProductHelper>();
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<FamilyType>::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3,
0, 1, false, false, true, yOrder, rootDeviceEnvironment);
EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder());
EncodeDispatchKernel<FamilyType>::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<FamilyType>::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3,
0, 1, false, false, true, linearOrder, rootDeviceEnvironment);
EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder());
EncodeDispatchKernel<FamilyType>::encodeThreadData(walkerCmd, startWorkGroup, numWorkGroups, workGroupSizes, 0, 3,
0, 1, true, false, true, linearOrder, rootDeviceEnvironment);
EXPECT_EQ(expectedWalkOrder, walkerCmd.getDispatchWalkOrder());
}