From 6ea3f5784961023b9dee85bf9a1c37aa9bf79bec Mon Sep 17 00:00:00 2001 From: Kamil Kopryk Date: Thu, 10 Jun 2021 11:54:07 +0000 Subject: [PATCH] Don't use bcs for mipmapped images OCL Signed-off-by: Kamil Kopryk Related-To: NEO-4692 --- opencl/source/command_queue/command_queue.cpp | 3 ++- opencl/source/command_queue/command_queue.h | 2 +- .../source/command_queue/enqueue_read_image.h | 2 +- .../command_queue/enqueue_write_image.h | 2 +- .../command_queue/command_queue_tests.cpp | 22 ++++++++++++++++++- .../test/unit_test/mocks/mock_command_queue.h | 6 ++--- 6 files changed, 29 insertions(+), 8 deletions(-) diff --git a/opencl/source/command_queue/command_queue.cpp b/opencl/source/command_queue/command_queue.cpp index f31fa317d7..5ddac0311b 100644 --- a/opencl/source/command_queue/command_queue.cpp +++ b/opencl/source/command_queue/command_queue.cpp @@ -745,7 +745,7 @@ bool CommandQueue::blitEnqueuePreferred(cl_command_type cmdType, const BuiltinOp return true; } -bool CommandQueue::blitEnqueueImageAllowed(const size_t *origin, const size_t *region) { +bool CommandQueue::blitEnqueueImageAllowed(const size_t *origin, const size_t *region, const Image &image) { const auto &hwInfo = device->getHardwareInfo(); const auto &hwHelper = HwHelper::get(hwInfo.platform.eRenderCoreFamily); auto blitEnqueuImageAllowed = hwHelper.isBlitterForImagesSupported(hwInfo); @@ -755,6 +755,7 @@ bool CommandQueue::blitEnqueueImageAllowed(const size_t *origin, const size_t *r } blitEnqueuImageAllowed &= (origin[0] + region[0] <= BlitterConstants::maxBlitWidth) && (origin[1] + region[1] <= BlitterConstants::maxBlitHeight); + blitEnqueuImageAllowed &= !isMipMapped(image.getImageDesc()); return blitEnqueuImageAllowed; } diff --git a/opencl/source/command_queue/command_queue.h b/opencl/source/command_queue/command_queue.h index 0a7c262550..27433bd3c9 100644 --- a/opencl/source/command_queue/command_queue.h +++ b/opencl/source/command_queue/command_queue.h @@ -354,7 +354,7 @@ class CommandQueue : public BaseObject<_cl_command_queue> { bool queueDependenciesClearRequired() const; bool blitEnqueueAllowed(cl_command_type cmdType) const; bool blitEnqueuePreferred(cl_command_type cmdType, const BuiltinOpParams &builtinOpParams) const; - MOCKABLE_VIRTUAL bool blitEnqueueImageAllowed(const size_t *origin, const size_t *region); + MOCKABLE_VIRTUAL bool blitEnqueueImageAllowed(const size_t *origin, const size_t *region, const Image &image); void aubCaptureHook(bool &blocking, bool &clearAllDependencies, const MultiDispatchInfo &multiDispatchInfo); virtual bool obtainTimestampPacketForCacheFlush(bool isCacheFlushRequired) const = 0; diff --git a/opencl/source/command_queue/enqueue_read_image.h b/opencl/source/command_queue/enqueue_read_image.h index 058cc7378a..d19c2074a9 100644 --- a/opencl/source/command_queue/enqueue_read_image.h +++ b/opencl/source/command_queue/enqueue_read_image.h @@ -41,7 +41,7 @@ cl_int CommandQueueHw::enqueueReadImage( const cl_event *eventWaitList, cl_event *event) { cl_command_type cmdType = CL_COMMAND_READ_IMAGE; - auto blitAllowed = blitEnqueueAllowed(cmdType) && blitEnqueueImageAllowed(origin, region); + auto blitAllowed = blitEnqueueAllowed(cmdType) && blitEnqueueImageAllowed(origin, region, *srcImage); auto &csr = getCommandStreamReceiver(blitAllowed); if (nullptr == mapAllocation) { diff --git a/opencl/source/command_queue/enqueue_write_image.h b/opencl/source/command_queue/enqueue_write_image.h index a77f1a9feb..dfef21f021 100644 --- a/opencl/source/command_queue/enqueue_write_image.h +++ b/opencl/source/command_queue/enqueue_write_image.h @@ -54,7 +54,7 @@ cl_int CommandQueueHw::enqueueWriteImage( HostPtrSurface hostPtrSurf(srcPtr, hostPtrSize, true); GeneralSurface mapSurface; Surface *surfaces[] = {&dstImgSurf, nullptr}; - auto blitAllowed = blitEnqueueAllowed(cmdType) && blitEnqueueImageAllowed(origin, region); + auto blitAllowed = blitEnqueueAllowed(cmdType) && blitEnqueueImageAllowed(origin, region, *dstImage); if (mapAllocation) { surfaces[1] = &mapSurface; mapSurface.setGraphicsAllocation(mapAllocation); 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 97f8ab7df6..75a06d4afb 100644 --- a/opencl/test/unit_test/command_queue/command_queue_tests.cpp +++ b/opencl/test/unit_test/command_queue/command_queue_tests.cpp @@ -37,6 +37,7 @@ #include "opencl/test/unit_test/mocks/mock_context.h" #include "opencl/test/unit_test/mocks/mock_csr.h" #include "opencl/test/unit_test/mocks/mock_event.h" +#include "opencl/test/unit_test/mocks/mock_image.h" #include "opencl/test/unit_test/mocks/mock_kernel.h" #include "opencl/test/unit_test/mocks/mock_mdi.h" #include "opencl/test/unit_test/mocks/mock_memory_manager.h" @@ -1313,6 +1314,8 @@ TEST(CommandQueue, givenCopySizeAndOffsetWhenCallingBlitEnqueueImageAllowedThenR DebugManager.flags.EnableBlitterForReadWriteImage.set(1); MockContext context{}; MockCommandQueue queue(&context, context.getDevice(0), 0); + MockImageBase image; + image.imageDesc.num_mip_levels = 1; auto maxBlitWidth = static_cast(BlitterConstants::maxBlitWidth); auto maxBlitHeight = static_cast(BlitterConstants::maxBlitHeight); @@ -1329,10 +1332,27 @@ TEST(CommandQueue, givenCopySizeAndOffsetWhenCallingBlitEnqueueImageAllowedThenR for (auto &[regionX, regionY, originX, originY, expectedResult] : testParams) { size_t region[3] = {regionX, regionY, 0}; size_t origin[3] = {originX, originY, 0}; - EXPECT_EQ(expectedResult, queue.blitEnqueueImageAllowed(origin, region)); + EXPECT_EQ(expectedResult, queue.blitEnqueueImageAllowed(origin, region, image)); } } +TEST(CommandQueue, givenMipMappedImageWhenCallingBlitEnqueueImageAllowedThenCorrectResultIsReturned) { + DebugManagerStateRestore restorer; + DebugManager.flags.EnableBlitterForReadWriteImage.set(1); + MockContext context{}; + MockCommandQueue queue(&context, context.getDevice(0), 0); + + size_t correctRegion[3] = {10u, 10u, 0}; + size_t correctOrigin[3] = {1u, 1u, 0}; + MockImageBase image; + + image.imageDesc.num_mip_levels = 1; + EXPECT_TRUE(queue.blitEnqueueImageAllowed(correctOrigin, correctRegion, image)); + + image.imageDesc.num_mip_levels = 2; + EXPECT_FALSE(queue.blitEnqueueImageAllowed(correctOrigin, correctRegion, image)); +} + TEST(CommandQueue, givenSupportForOperationWhenValidatingSupportThenReturnSuccess) { MockCommandQueue queue{}; diff --git a/opencl/test/unit_test/mocks/mock_command_queue.h b/opencl/test/unit_test/mocks/mock_command_queue.h index dbede2dd14..7b4206f49b 100644 --- a/opencl/test/unit_test/mocks/mock_command_queue.h +++ b/opencl/test/unit_test/mocks/mock_command_queue.h @@ -194,7 +194,7 @@ class MockCommandQueue : public CommandQueue { template class MockCommandQueueHw : public CommandQueueHw { - typedef CommandQueueHw BaseClass; + using BaseClass = CommandQueueHw; public: using BaseClass::bcsEngine; @@ -310,8 +310,8 @@ class MockCommandQueueHw : public CommandQueueHw { return BaseClass::isCacheFlushForBcsRequired(); } - bool blitEnqueueImageAllowed(const size_t *origin, const size_t *region) override { - isBlitEnqueueImageAllowed = BaseClass::blitEnqueueImageAllowed(origin, region); + bool blitEnqueueImageAllowed(const size_t *origin, const size_t *region, const Image &image) override { + isBlitEnqueueImageAllowed = BaseClass::blitEnqueueImageAllowed(origin, region, image); return isBlitEnqueueImageAllowed; }