From d9b3fd06230dbb1dc1307b1a53057b2f9ea2b401 Mon Sep 17 00:00:00 2001 From: "Dunajski, Bartosz" Date: Wed, 22 Nov 2023 16:10:41 +0000 Subject: [PATCH] feature: add support for ForceBcsEngineIndex flag Related-To: NEO-8356 Signed-off-by: Dunajski, Bartosz --- level_zero/core/source/device/device_imp.cpp | 4 ++ .../xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp | 55 +++++++++++++++++++ 2 files changed, 59 insertions(+) diff --git a/level_zero/core/source/device/device_imp.cpp b/level_zero/core/source/device/device_imp.cpp index a6bbc805e6..3a7cb74196 100644 --- a/level_zero/core/source/device/device_imp.cpp +++ b/level_zero/core/source/device/device_imp.cpp @@ -1526,6 +1526,10 @@ ze_result_t DeviceImp::getCsrForOrdinalAndIndex(NEO::CommandStreamReceiver **csr return ZE_RESULT_ERROR_INVALID_ARGUMENT; } + if ((NEO::DebugManager.flags.ForceBcsEngineIndex.get() != -1) && NEO::EngineHelper::isCopyOnlyEngineType(getEngineGroupTypeForOrdinal(ordinal))) { + index = static_cast(NEO::DebugManager.flags.ForceBcsEngineIndex.get()); + } + if (ordinal < numEngineGroups) { auto &engines = engineGroups[ordinal].engines; if (index >= engines.size()) { diff --git a/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp b/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp index 8ccdbbd8f2..f689ae0a18 100644 --- a/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp +++ b/level_zero/core/test/unit_tests/xe_hpc_core/test_cmdqueue_xe_hpc_core.cpp @@ -117,6 +117,61 @@ HWTEST2_F(CommandQueueCommandsXeHpc, givenCommandQueueWhenExecutingCommandListsF commandQueue->destroy(); } +HWTEST2_F(CommandQueueCommandsXeHpc, givenDebugFlagSetWhenCreatingCommandQueueThenOverrideEngineIndex, IsXeHpcCore) { + DebugManagerStateRestore restore; + uint32_t newIndex = 2; + DebugManager.flags.ForceBcsEngineIndex.set(newIndex); + ze_result_t returnValue; + auto hwInfo = *NEO::defaultHwInfo; + hwInfo.featureTable.ftrBcsInfo = 0b111111111; + hwInfo.capabilityTable.blitterOperationsSupported = true; + + auto testNeoDevice = NEO::MockDevice::createWithNewExecutionEnvironment(&hwInfo); + + auto testL0Device = std::unique_ptr(L0::Device::create(driverHandle.get(), testNeoDevice, false, &returnValue)); + + auto &engineGroups = testNeoDevice->getRegularEngineGroups(); + + bool queueCreated = false; + bool hasMultiInstancedEngine = false; + for (uint32_t ordinal = 0; ordinal < engineGroups.size(); ordinal++) { + for (uint32_t index = 0; index < engineGroups[ordinal].engines.size(); index++) { + bool copyOrdinal = NEO::EngineHelper::isCopyOnlyEngineType(engineGroups[ordinal].engineGroupType); + if (engineGroups[ordinal].engines.size() > 1 && copyOrdinal) { + hasMultiInstancedEngine = true; + } + + ze_command_queue_handle_t commandQueue = {}; + + ze_command_queue_desc_t desc = {}; + desc.ordinal = ordinal; + desc.index = index; + ze_result_t res = context->createCommandQueue(testL0Device.get(), &desc, &commandQueue); + + if (newIndex < engineGroups[ordinal].engines.size() || !copyOrdinal) { + EXPECT_EQ(ZE_RESULT_SUCCESS, res); + EXPECT_NE(nullptr, commandQueue); + + auto queue = whiteboxCast(L0::CommandQueue::fromHandle(commandQueue)); + + if (copyOrdinal) { + EXPECT_EQ(engineGroups[ordinal].engines[newIndex].commandStreamReceiver, queue->csr); + } else { + EXPECT_EQ(engineGroups[ordinal].engines[index].commandStreamReceiver, queue->csr); + } + + queue->destroy(); + queueCreated = true; + } else { + EXPECT_EQ(ZE_RESULT_ERROR_INVALID_ARGUMENT, res); + EXPECT_EQ(nullptr, commandQueue); + } + } + } + + EXPECT_EQ(hasMultiInstancedEngine, queueCreated); +} + HWTEST2_F(CommandQueueCommandsXeHpc, givenLinkedCopyEngineOrdinalWhenCreatingThenSetAsCopyOnly, IsXeHpcCore) { ze_result_t returnValue; auto hwInfo = *NEO::defaultHwInfo;