/* * Copyright (C) 2020-2024 Intel Corporation * * SPDX-License-Identifier: MIT * */ #include "shared/source/built_ins/built_ins.h" #include "shared/source/helpers/compiler_product_helper.h" #include "shared/source/helpers/gfx_core_helper.h" #include "shared/test/common/fixtures/device_fixture.h" #include "shared/test/common/helpers/debug_manager_state_restore.h" #include "shared/test/common/mocks/mock_builtinslib.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/ult_device_factory.h" #include "shared/test/common/test_macros/hw_test.h" #include "gtest/gtest.h" #include using BuiltInSharedTest = Test; HWTEST2_F(BuiltInSharedTest, givenUseBindlessBuiltinDisabledWhenBinExtensionPassedThenNameHasBindfulPrefix, HasStatefulSupport) { DebugManagerStateRestore dbgRestorer; debugManager.flags.UseBindlessMode.set(0); auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceNameGeneric = "bindful_copy_buffer_to_buffer.builtin_kernel.bin"; std::string expectedResourceNameForRelease = deviceIpString + "_" + expectedResourceNameGeneric; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceNameForRelease); } HWTEST2_F(BuiltInSharedTest, givenUseBindlessBuiltinEnabledWhenBinExtensionPassedThenNameHasBindlessPrefix, HasStatefulSupport) { DebugManagerStateRestore dbgRestorer; debugManager.flags.UseBindlessMode.set(1); auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceNameGeneric = "bindless_copy_buffer_to_buffer.builtin_kernel.bin"; std::string expectedResourceNameForRelease = deviceIpString + "_" + expectedResourceNameGeneric; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceNameForRelease); } HWTEST_F(BuiltInSharedTest, whenTryingToGetBuiltinResourceForUnregisteredPlatformThenOnlyIntermediateFormatIsAvailable) { auto builtinsLib = std::make_unique(); auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); hwInfo.ipVersion.value += 0xdead; const std::array builtinTypes{EBuiltInOps::copyBufferToBuffer, EBuiltInOps::copyBufferRect, EBuiltInOps::fillBuffer, EBuiltInOps::copyBufferToImage3d, EBuiltInOps::copyImage3dToBuffer, EBuiltInOps::copyImageToImage1d, EBuiltInOps::copyImageToImage2d, EBuiltInOps::copyImageToImage3d, EBuiltInOps::fillImage1d, EBuiltInOps::fillImage2d, EBuiltInOps::fillImage3d}; for (auto &builtinType : builtinTypes) { auto binaryBuiltinResource = builtinsLib->getBuiltinResource(builtinType, BuiltinCode::ECodeType::binary, *pDevice); EXPECT_EQ(0U, binaryBuiltinResource.size()); auto intermediateBuiltinResource = builtinsLib->getBuiltinResource(builtinType, BuiltinCode::ECodeType::intermediate, *pDevice); EXPECT_NE(0U, intermediateBuiltinResource.size()); } } HWTEST2_F(BuiltInSharedTest, GivenStatelessBuiltinWhenGettingResourceNameThenAddressingIsStateless, HasStatefulSupport) { auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBufferStateless, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceNameGeneric = "stateless_copy_buffer_to_buffer_stateless.builtin_kernel.bin"; std::string expectedResourceNameForRelease = deviceIpString + "_" + expectedResourceNameGeneric; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceNameForRelease); } HWTEST2_F(BuiltInSharedTest, GivenPlatformWithoutStatefulAddresingSupportWhenGettingResourceNamesThenStatelessResourceNameIsReturned, HasNoStatefulSupport) { auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); { auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceName = deviceIpString + "_stateless_copy_buffer_to_buffer.builtin_kernel.bin"; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceName); } { auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBufferStateless, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceName = deviceIpString + "_stateless_copy_buffer_to_buffer_stateless.builtin_kernel.bin"; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceName); } } HWTEST_F(BuiltInSharedTest, GivenRequestedTypeIntermediateWhenGettingResourceNamesThenReturnForReleaseAndGenericResourceNames) { DebugManagerStateRestore dbgRestorer; debugManager.flags.UseBindlessMode.set(0); auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); auto resourceNames = getBuiltinResourceNames(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::intermediate, *pDevice); std::string expectedResourceNameGeneric = "copy_buffer_to_buffer.builtin_kernel.spv"; std::string expectedResourceNameForRelease = deviceIpString + "_" + expectedResourceNameGeneric; EXPECT_EQ(2u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceNameForRelease); EXPECT_EQ(resourceNames[1], expectedResourceNameGeneric); } HWTEST_F(BuiltInSharedTest, GivenValidBuiltinTypeAndExtensionWhenCreatingBuiltinResourceNameThenCorrectNameIsReturned) { std::string builtinResourceName = createBuiltinResourceName(EBuiltInOps::copyBufferToBuffer, ".bin"); std::string expectedBuiltinResourceName = std::string(getBuiltinAsString(EBuiltInOps::copyBufferToBuffer)) + ".bin"; EXPECT_EQ(expectedBuiltinResourceName, builtinResourceName); } HWTEST_F(BuiltInSharedTest, GivenValidBuiltinTypeAndAnyTypeWhenGettingBuiltinCodeThenNonEmptyBuiltinIsReturned) { auto builtinsLib = std::make_unique(); auto builtinCode = builtinsLib->getBuiltinCode(EBuiltInOps::copyBufferToBuffer, BuiltinCode::ECodeType::any, *pDevice); EXPECT_EQ(BuiltinCode::ECodeType::binary, builtinCode.type); EXPECT_NE(0U, builtinCode.resource.size()); } HWTEST2_F(BuiltInSharedTest, GivenHeaplessModeEnabledWhenGetBuiltinResourceNamesIsCalledThenResourceNameIsCorrect, MatchAny) { class MockCompilerProductHelper : public CompilerProductHelperHw { public: bool isHeaplessModeEnabled() const override { return true; } }; pDevice->executionEnvironment->rootDeviceEnvironments[0]->compilerProductHelper.reset(new MockCompilerProductHelper()); auto &hwInfo = *pDevice->getRootDeviceEnvironment().getMutableHardwareInfo(); std::string deviceIpString = std::to_string(hwInfo.ipVersion.architecture) + "_" + std::to_string(hwInfo.ipVersion.release) + "_" + std::to_string(hwInfo.ipVersion.revision); struct TestParam { std::string builtInTypeAsString; EBuiltInOps::Type builtinType; }; TestParam params[] = { {"copy_buffer_to_buffer_stateless", EBuiltInOps::copyBufferToBufferStatelessHeapless}, {"copy_buffer_rect_stateless", EBuiltInOps::copyBufferRectStatelessHeapless}, {"fill_buffer_stateless", EBuiltInOps::fillBufferStatelessHeapless}}; for (auto &[builtInTypeAsString, builtInType] : params) { auto resourceNames = getBuiltinResourceNames(builtInType, BuiltinCode::ECodeType::binary, *pDevice); std::string expectedResourceNameGeneric = "stateless_heapless_" + builtInTypeAsString + ".builtin_kernel.bin"; std::string expectedResourceNameForRelease = deviceIpString + "_" + expectedResourceNameGeneric; EXPECT_EQ(1u, resourceNames.size()); EXPECT_EQ(resourceNames[0], expectedResourceNameForRelease); } }