From 6c59fd53afadf6744ee14a3063e6f07d819c029b Mon Sep 17 00:00:00 2001 From: Lukasz Jobczyk Date: Mon, 8 Sep 2025 08:30:00 +0000 Subject: [PATCH] refactor: Add new mode to EnableBlitterForEnqueueOperations Add option to EnableBlitterForEnqueueOperations to disable BCS except image from buffer Signed-off-by: Lukasz Jobczyk --- opencl/source/command_queue/command_queue.cpp | 2 ++ .../command_queue/command_queue_tests.cpp | 35 +++++++++++++++++++ .../debug_settings/debug_variables_base.inl | 2 +- 3 files changed, 38 insertions(+), 1 deletion(-) diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index bb3bf6fb9c..b7bd26ad89 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -293,6 +293,8 @@ CommandStreamReceiver &CommandQueue::selectCsrForBuiltinOperation(const CsrSelec preferBcs = device->getRootDeviceEnvironment().isWddmOnLinux() || productHelper.blitEnqueuePreferred(isWriteToImageFromBuffer); if (debugManager.flags.EnableBlitterForEnqueueOperations.get() == 1) { preferBcs = true; + } else if (debugManager.flags.EnableBlitterForEnqueueOperations.get() == 2) { + preferBcs = isWriteToImageFromBuffer; } auto preferredBCSType = true; diff --git a/opencl/test/unit_test/command_queue/command_queue_tests.cpp b/opencl/test/unit_test/command_queue/command_queue_tests.cpp index e03e90570c..5c25892821 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -3499,6 +3499,41 @@ HWTEST_F(CsrSelectionCommandQueueWithBlitterTests, givenImageFromBufferThenBcsAl } } +HWTEST_F(CsrSelectionCommandQueueWithBlitterTests, givenEnableBlitterForEnqueueOperationsSetToTwoWhenSelectCsrForImageFromBufferThenBcsAlwaysPreferredOtherwiseUseCcs) { + DebugManagerStateRestore restore{}; + debugManager.flags.EnableBlitterForEnqueueOperations.set(2); + debugManager.flags.EnableBlitterForEnqueueImageOperations.set(1); + + cl_command_queue_properties queueProperties[5] = {}; + auto queue = std::make_unique(context.get(), clDevice.get(), queueProperties, false); + auto ccsCsr = static_cast *>(&queue->getGpgpuCommandStreamReceiver()); + auto bcsCsr = queue->getBcsCommandStreamReceiver(*queue->bcsQueueEngineType); + + { + auto buffer = std::unique_ptr(BufferHelper<>::create(context.get())); + size_t origin[3] = {0, 0, 0}; + size_t region[3] = {1, 1, 1}; + MockImageBase dstImage{}; + dstImage.associatedMemObject = buffer.get(); + + CsrSelectionArgs args{CL_COMMAND_WRITE_IMAGE, nullptr, &dstImage, 0u, region, nullptr, origin}; + EXPECT_TRUE(args.dstResource.image->isImageFromBuffer()); + + EXPECT_EQ(bcsCsr, &queue->selectCsrForBuiltinOperation(args)); + } + { + auto buffer = std::unique_ptr(BufferHelper<>::create(context.get())); + size_t origin[3] = {0, 0, 0}; + size_t region[3] = {1, 1, 1}; + MockImageBase dstImage{}; + + CsrSelectionArgs args{CL_COMMAND_WRITE_IMAGE, nullptr, &dstImage, 0u, region, nullptr, origin}; + EXPECT_FALSE(args.dstResource.image->isImageFromBuffer()); + + EXPECT_EQ(ccsCsr, &queue->selectCsrForBuiltinOperation(args)); + } +} + HWTEST_F(CommandQueueTests, GivenOOQCommandQueueWhenIsGpgpuSubmissionForBcsRequiredCalledThenReturnCorrectValue) { auto device = std::make_unique(MockDevice::createWithNewExecutionEnvironment(defaultHwInfo.get())); MockContext context(device.get()); diff --git a/shared/source/debug_settings/debug_variables_base.inl b/shared/source/debug_settings/debug_variables_base.inl index b9b8e74242..d1913b4acc 100644 --- a/shared/source/debug_settings/debug_variables_base.inl +++ b/shared/source/debug_settings/debug_variables_base.inl @@ -507,7 +507,7 @@ DECLARE_DEBUG_VARIABLE(int32_t, EnableBOMmapCreate, -1, "Create BOs using mmap, DECLARE_DEBUG_VARIABLE(int32_t, EnableGemCloseWorker, -1, "Use asynchronous gem object closing, -1:default, 0:disable, 1:enable") DECLARE_DEBUG_VARIABLE(int32_t, EnableHostPtrValidation, -1, "Validate BO from GEM_USERPTR, -1:default(enable), 0:disable, 1:enable") DECLARE_DEBUG_VARIABLE(int32_t, EnableBlitterOperationsSupport, -1, "-1: default, 0: disable, 1: enable") -DECLARE_DEBUG_VARIABLE(int32_t, EnableBlitterForEnqueueOperations, -1, "Use Blitter engine for enqueue operations. -1: default, 0: disabled, 1: enabled") +DECLARE_DEBUG_VARIABLE(int32_t, EnableBlitterForEnqueueOperations, -1, "Use Blitter engine for enqueue operations. -1: default, 0: disabled, 1: enabled for every enqueue, 2: disabled, except image from buffer writes") DECLARE_DEBUG_VARIABLE(int32_t, EnableBlitterForEnqueueImageOperations, -1, "Use Blitter engine for read/write/copy image operations. -1: default, 0: disabled, 1: enabled") DECLARE_DEBUG_VARIABLE(int32_t, EnableCacheFlushAfterWalker, -1, "-1: platform behavior, 0: disabled, 1: enabled. Adds dedicated cache flush command after WALKER command when surfaces used by kernel require to flush the cache") DECLARE_DEBUG_VARIABLE(int32_t, EnableLocalMemory, -1, "-1: default behavior, 0: disabled, 1: enabled, Allows allocating graphics memory in Local Memory")