diff --git a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_enqueue_cmdlist.cpp b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_enqueue_cmdlist.cpp index 2fd89ff358..4ea3df0cbd 100644 --- a/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_enqueue_cmdlist.cpp +++ b/level_zero/core/test/unit_tests/sources/cmdqueue/test_cmdqueue_enqueue_cmdlist.cpp @@ -814,6 +814,7 @@ HWTEST2_F(MultiDeviceCommandQueueExecuteCommandLists, givenMultiplePartitionCoun desc.mode = ZE_COMMAND_QUEUE_MODE_ASYNCHRONOUS; ze_result_t returnValue; + auto commandQueue = whitebox_cast(CommandQueue::create(productFamily, device, device->getNEODevice()->getDefaultEngine().commandStreamReceiver, @@ -823,6 +824,11 @@ HWTEST2_F(MultiDeviceCommandQueueExecuteCommandLists, givenMultiplePartitionCoun returnValue)); EXPECT_EQ(ZE_RESULT_SUCCESS, returnValue); + auto &commandStreamReceiver = device->getNEODevice()->getDefaultEngine().commandStreamReceiver; + if (device->getNEODevice()->getPreemptionMode() == PreemptionMode::MidThread || device->getNEODevice()->isDebuggerActive()) { + commandStreamReceiver->createPreemptionAllocation(); + } + ze_fence_desc_t fenceDesc{}; auto fence = whitebox_cast(Fence::create(commandQueue, &fenceDesc)); ASSERT_NE(nullptr, fence); diff --git a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger.cpp b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger.cpp index 3f9dc003d1..56fe1745f9 100644 --- a/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger.cpp +++ b/level_zero/core/test/unit_tests/sources/debugger/test_l0_debugger.cpp @@ -100,7 +100,9 @@ TEST(Debugger, givenL0DebuggerOFFWhenGettingStateSaveAreaHeaderThenValidSipTypeI auto &stateSaveAreaHeader = SipKernel::getSipKernel(*neoDevice).getStateSaveAreaHeader(); if (isHexadecimalArrayPreferred) { - auto &expectedStateSaveAreaHeader = neoDevice->getRootDeviceEnvironment().sipKernels[static_cast(sipType)]->getStateSaveAreaHeader(); + auto sipKernel = neoDevice->getRootDeviceEnvironment().sipKernels[static_cast(sipType)].get(); + ASSERT_NE(sipKernel, nullptr); + auto &expectedStateSaveAreaHeader = sipKernel->getStateSaveAreaHeader(); EXPECT_EQ(expectedStateSaveAreaHeader, stateSaveAreaHeader); } else { auto &expectedStateSaveAreaHeader = neoDevice->getBuiltIns()->getSipKernel(sipType, *neoDevice).getStateSaveAreaHeader(); diff --git a/level_zero/core/test/unit_tests/sources/image/test_image.cpp b/level_zero/core/test/unit_tests/sources/image/test_image.cpp index c975d5b5fc..3b4d925bb5 100644 --- a/level_zero/core/test/unit_tests/sources/image/test_image.cpp +++ b/level_zero/core/test/unit_tests/sources/image/test_image.cpp @@ -11,6 +11,7 @@ #include "shared/test/common/helpers/default_hw_info.h" #include "shared/test/common/mocks/mock_device.h" #include "shared/test/common/mocks/mock_gmm_client_context.h" +#include "shared/test/common/mocks/mock_sip.h" #include "test.h" @@ -424,6 +425,7 @@ class FailMemoryManagerMock : public NEO::OsAgnosticMemoryManager { HWTEST2_F(ImageCreate, givenImageDescWhenFailImageAllocationThenProperErrorIsReturned, ImageSupport) { using RENDER_SURFACE_STATE = typename FamilyType::RENDER_SURFACE_STATE; + VariableBackup backupSipInitType{&MockSipData::useMockSip}; ze_image_desc_t desc = {}; @@ -440,6 +442,11 @@ HWTEST2_F(ImageCreate, givenImageDescWhenFailImageAllocationThenProperErrorIsRet desc.format.z = ZE_IMAGE_FORMAT_SWIZZLE_1; desc.format.w = ZE_IMAGE_FORMAT_SWIZZLE_X; + auto isHexadecimalArrayPrefered = NEO::HwHelper::get(NEO::defaultHwInfo->platform.eRenderCoreFamily).isSipKernelAsHexadecimalArrayPreferred(); + if (isHexadecimalArrayPrefered) { + backupSipInitType = true; + } + NEO::MockDevice *neoDevice = nullptr; neoDevice = NEO::MockDevice::createWithNewExecutionEnvironment(NEO::defaultHwInfo.get()); NEO::MemoryManager *currMemoryManager = new FailMemoryManagerMock(*neoDevice->executionEnvironment); diff --git a/opencl/test/unit_test/command_queue/dispatch_walker_tests_xehp_and_later.cpp b/opencl/test/unit_test/command_queue/dispatch_walker_tests_xehp_and_later.cpp index 218824da99..d5840c35ad 100644 --- a/opencl/test/unit_test/command_queue/dispatch_walker_tests_xehp_and_later.cpp +++ b/opencl/test/unit_test/command_queue/dispatch_walker_tests_xehp_and_later.cpp @@ -1431,6 +1431,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, XeHPAndLaterDispatchWalkerBasicTestDynamicPartition size_t gws[] = {128, 1, 1}; size_t lws[] = {8, 1, 1}; auto &commandStreamReceiver = cmdQ->getUltCommandStreamReceiver(); + if (device->getPreemptionMode() == PreemptionMode::MidThread || device->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } EXPECT_EQ(1u, commandStreamReceiver.activePartitions); cmdQ->enqueueKernel(kernel->mockKernel, 1, nullptr, gws, lws, 0, nullptr, nullptr); EXPECT_EQ(1u, commandStreamReceiver.activePartitions); @@ -1464,6 +1467,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, XeHPAndLaterDispatchWalkerBasicTestStaticPartition, size_t gws[] = {128, 1, 1}; size_t lws[] = {8, 1, 1}; auto &commandStreamReceiver = cmdQ->getUltCommandStreamReceiver(); + if (device->getPreemptionMode() == PreemptionMode::MidThread || device->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } EXPECT_EQ(1u, commandStreamReceiver.activePartitions); cmdQ->enqueueKernel(kernel->mockKernel, 1, nullptr, gws, lws, 0, nullptr, nullptr); EXPECT_EQ(1u, commandStreamReceiver.activePartitions); diff --git a/opencl/test/unit_test/command_queue/enqueue_with_walker_partition_tests.cpp b/opencl/test/unit_test/command_queue/enqueue_with_walker_partition_tests.cpp index 5b337177ff..d21dd64a8e 100644 --- a/opencl/test/unit_test/command_queue/enqueue_with_walker_partition_tests.cpp +++ b/opencl/test/unit_test/command_queue/enqueue_with_walker_partition_tests.cpp @@ -44,6 +44,7 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, EnqueueWithWalkerPartitionTests, givenCsrWithSpecif MockCommandQueueHw commandQueue(context.get(), rootDevice.get(), nullptr); commandQueue.gpgpuEngine = &engineControlForFusedQueue; + rootDevice->setPreemptionMode(PreemptionMode::Disabled); MockKernelWithInternals kernel(*rootDevice, context.get()); size_t offset[3] = {0, 0, 0}; diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_1_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_1_tests.cpp index 3d24f67844..7ed4111245 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_1_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_1_tests.cpp @@ -1001,7 +1001,6 @@ HWTEST_F(CommandStreamReceiverFlushTaskTests, GivenEnoughMemoryOnlyForPreambleAn hardwareInfo.gtSystemInfo.CCSInfo.NumberOfCCSEnabled = 1; auto mockDevice = std::unique_ptr(MockDevice::createWithNewExecutionEnvironment(&hardwareInfo, 0u)); auto &commandStreamReceiver = mockDevice->getUltCommandStreamReceiver(); - commandStreamReceiver.timestampPacketWriteEnabled = false; // Force a PIPE_CONTROL through a taskLevel transition taskLevel = commandStreamReceiver.peekTaskLevel() + 1; diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp index ab087f4ae0..3fb931ac66 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_flush_task_tests_xehp_and_later.cpp @@ -813,6 +813,9 @@ struct CommandStreamReceiverFlushTaskXeHPAndLaterMultiTileTests : public Command HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTileTests, givenMultipleStaticActivePartitionsWhenFlushingTaskThenExpectTagUpdatePipeControlWithPartitionFlagOnAndActivePartitionConfig) { auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + if (pDevice->getPreemptionMode() == PreemptionMode::MidThread || pDevice->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } EXPECT_EQ(1u, commandStreamReceiver.activePartitionsConfig); commandStreamReceiver.activePartitions = 2; commandStreamReceiver.taskCount = 3; @@ -830,6 +833,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTile HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTileTests, givenMultipleDynamicActivePartitionsWhenFlushingTaskThenExpectTagUpdatePipeControlWithoutPartitionFlagOnAndNoActivePartitionConfig) { auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + if (pDevice->getPreemptionMode() == PreemptionMode::MidThread || pDevice->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } commandStreamReceiver.activePartitions = 2; commandStreamReceiver.taskCount = 3; commandStreamReceiver.staticWorkPartitioningEnabled = false; @@ -846,6 +852,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTile HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTileTests, givenSingleStaticActivePartitionWhenFlushingTaskThenExpectTagUpdatePipeControlWithoutPartitionFlagOnAndNoActivePartitionConfig) { auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + if (pDevice->getPreemptionMode() == PreemptionMode::MidThread || pDevice->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } commandStreamReceiver.activePartitions = 1; commandStreamReceiver.taskCount = 3; flushTask(commandStreamReceiver, true); @@ -864,6 +873,9 @@ HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTile HWCMDTEST_F(IGFX_XE_HP_CORE, CommandStreamReceiverFlushTaskXeHPAndLaterMultiTileTests, givenMultipleStaticActivePartitionsWhenFlushingTaskTwiceThenExpectTagUpdatePipeControlWithPartitionFlagOnAndNoActivePartitionConfigAtSecondFlush) { auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + if (pDevice->getPreemptionMode() == PreemptionMode::MidThread || pDevice->isDebuggerActive()) { + commandStreamReceiver.createPreemptionAllocation(); + } EXPECT_EQ(1u, commandStreamReceiver.activePartitionsConfig); commandStreamReceiver.activePartitions = 2; commandStreamReceiver.taskCount = 3; diff --git a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_1_tests.cpp b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_1_tests.cpp index 88f11cf508..51a45287c7 100644 --- a/opencl/test/unit_test/command_stream/command_stream_receiver_hw_1_tests.cpp +++ b/opencl/test/unit_test/command_stream/command_stream_receiver_hw_1_tests.cpp @@ -102,6 +102,27 @@ HWTEST_F(UltCommandStreamReceiverTest, givenSentStateSipFlagSetWhenGetRequiredSt EXPECT_EQ(sizeForStateSip, sizeWithStateSipIsNotSent - sizeWhenSipIsSent); } +HWTEST_F(UltCommandStreamReceiverTest, whenGetCmdSizeForPerDssBackedBufferIsCalledThenCorrectResultIsReturned) { + auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); + DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); + dispatchFlags.usePerDssBackedBuffer = false; + commandStreamReceiver.isPerDssBackedBufferSent = true; + auto basicSize = commandStreamReceiver.getRequiredCmdStreamSize(dispatchFlags, *pDevice); + + { + dispatchFlags.usePerDssBackedBuffer = true; + commandStreamReceiver.isPerDssBackedBufferSent = true; + auto newSize = commandStreamReceiver.getRequiredCmdStreamSize(dispatchFlags, *pDevice); + EXPECT_EQ(basicSize, newSize); + } + { + dispatchFlags.usePerDssBackedBuffer = true; + commandStreamReceiver.isPerDssBackedBufferSent = false; + auto newSize = commandStreamReceiver.getRequiredCmdStreamSize(dispatchFlags, *pDevice); + EXPECT_EQ(basicSize, newSize - commandStreamReceiver.getCmdSizeForPerDssBackedBuffer(pDevice->getHardwareInfo())); + } +} + HWTEST_F(UltCommandStreamReceiverTest, givenSentStateSipFlagSetAndSourceLevelDebuggerIsActiveWhenGetRequiredStateSipCmdSizeIsCalledThenStateSipCmdSizeIsIncluded) { auto &commandStreamReceiver = pDevice->getUltCommandStreamReceiver(); DispatchFlags dispatchFlags = DispatchFlagsHelper::createDefaultDispatchFlags(); diff --git a/shared/source/built_ins/sip.cpp b/shared/source/built_ins/sip.cpp index 2ff95f7ca0..66f5012fd2 100644 --- a/shared/source/built_ins/sip.cpp +++ b/shared/source/built_ins/sip.cpp @@ -152,17 +152,18 @@ std::string SipKernel::createHeaderFilename(const std::string &fileName) { } bool SipKernel::initHexadecimalArraySipKernel(SipKernelType type, Device &device) { + uint32_t sipIndex = static_cast(type); + uint32_t rootDeviceIndex = device.getRootDeviceIndex(); + auto sipKenel = device.getExecutionEnvironment()->rootDeviceEnvironments[rootDeviceIndex]->sipKernels[sipIndex].get(); + if (sipKenel != nullptr) { + return true; + } + uint32_t *sipKernelBinary = nullptr; size_t kernelBinarySize = 0u; auto &hwInfo = device.getHardwareInfo(); auto &hwHelper = HwHelper::get(hwInfo.platform.eRenderCoreFamily); hwHelper.setSipKernelData(sipKernelBinary, kernelBinarySize); - - uint32_t sipIndex = static_cast(type); - uint32_t rootDeviceIndex = device.getRootDeviceIndex(); - if (device.getExecutionEnvironment()->rootDeviceEnvironments[rootDeviceIndex]->sipKernels[sipIndex].get() != nullptr) { - return true; - } const auto allocType = GraphicsAllocation::AllocationType::KERNEL_ISA_INTERNAL; AllocationProperties properties = {rootDeviceIndex, kernelBinarySize, allocType, device.getDeviceBitfield()}; properties.flags.use32BitFrontWindow = false; diff --git a/shared/source/command_stream/command_stream_receiver_hw_base.inl b/shared/source/command_stream/command_stream_receiver_hw_base.inl index d005f08b4a..9801b5bd1b 100644 --- a/shared/source/command_stream/command_stream_receiver_hw_base.inl +++ b/shared/source/command_stream/command_stream_receiver_hw_base.inl @@ -815,7 +815,9 @@ size_t CommandStreamReceiverHw::getRequiredCmdStreamSize(const Dispat size += getCmdSizeForMediaSampler(dispatchFlags.pipelineSelectArgs.mediaSamplerRequired); size += getCmdSizeForPipelineSelect(); size += getCmdSizeForPreemption(dispatchFlags); - size += getCmdSizeForPerDssBackedBuffer(device.getHardwareInfo()); + if (dispatchFlags.usePerDssBackedBuffer && !isPerDssBackedBufferSent) { + size += getCmdSizeForPerDssBackedBuffer(device.getHardwareInfo()); + } size += getCmdSizeForEpilogue(dispatchFlags); size += getCmdsSizeForHardwareContext(); size += getCmdSizeForActivePartitionConfig(); diff --git a/shared/test/common/helpers/sip_init.cpp b/shared/test/common/helpers/sip_init.cpp index c24be33d76..194f7373bc 100644 --- a/shared/test/common/helpers/sip_init.cpp +++ b/shared/test/common/helpers/sip_init.cpp @@ -48,6 +48,8 @@ const SipKernel &SipKernel::getSipKernel(Device &device) { if (MockSipData::useMockSip) { return *MockSipData::mockSipKernel.get(); } else { + auto sipType = SipKernel::getSipKernelType(device); + SipKernel::initSipKernel(sipType, device); return SipKernel::getSipKernelImpl(device); } }