From 0ef81b2bc044a954816583dcd8e3360da9b778f0 Mon Sep 17 00:00:00 2001 From: Kamil Kopryk Date: Mon, 4 Nov 2019 21:02:22 +0100 Subject: [PATCH] Add support for stateless read buffer rect Change-Id: I794be4cacaa9de661c0c7e6ec67da85b0d5eed9a Signed-off-by: Kamil Kopryk Related-To: NEO-3314 --- .../command_queue/enqueue_read_buffer_rect.h | 13 +++- .../enqueue_read_buffer_rect_tests.cpp | 74 +++++++++++++++++++ 2 files changed, 84 insertions(+), 3 deletions(-) diff --git a/runtime/command_queue/enqueue_read_buffer_rect.h b/runtime/command_queue/enqueue_read_buffer_rect.h index 6374a932c9..dc73c42ff5 100644 --- a/runtime/command_queue/enqueue_read_buffer_rect.h +++ b/runtime/command_queue/enqueue_read_buffer_rect.h @@ -34,7 +34,6 @@ cl_int CommandQueueHw::enqueueReadBufferRect( const cl_event *eventWaitList, cl_event *event) { - MultiDispatchInfo dispatchInfo; auto isMemTransferNeeded = true; if (buffer->isMemObjZeroCopy()) { size_t bufferOffset; @@ -46,8 +45,14 @@ cl_int CommandQueueHw::enqueueReadBufferRect( return enqueueMarkerForReadWriteOperation(buffer, ptr, CL_COMMAND_READ_BUFFER_RECT, blockingRead, numEventsInWaitList, eventWaitList, event); } - auto &builder = getDevice().getExecutionEnvironment()->getBuiltIns()->getBuiltinDispatchInfoBuilder(EBuiltInOps::CopyBufferRect, - this->getContext(), this->getDevice()); + + auto eBuiltInOps = EBuiltInOps::CopyBufferRect; + if (forceStateless(buffer->getSize())) { + eBuiltInOps = EBuiltInOps::CopyBufferRectStateless; + } + auto &builder = getDevice().getExecutionEnvironment()->getBuiltIns()->getBuiltinDispatchInfoBuilder(eBuiltInOps, + this->getContext(), + this->getDevice()); BuiltInOwnershipWrapper builtInLock(builder, this->context); size_t hostPtrSize = Buffer::calculateHostPtrSize(hostOrigin, region, hostRowPitch, hostSlicePitch); @@ -81,6 +86,8 @@ cl_int CommandQueueHw::enqueueReadBufferRect( dc.srcSlicePitch = bufferSlicePitch; dc.dstRowPitch = hostRowPitch; dc.dstSlicePitch = hostSlicePitch; + + MultiDispatchInfo dispatchInfo; builder.buildDispatchInfos(dispatchInfo, dc); enqueueHandler( diff --git a/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp b/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp index c47891f696..31b217680c 100644 --- a/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp +++ b/unit_tests/command_queue/enqueue_read_buffer_rect_tests.cpp @@ -14,6 +14,7 @@ #include "unit_tests/command_queue/enqueue_read_buffer_rect_fixture.h" #include "unit_tests/fixtures/buffer_enqueue_fixture.h" #include "unit_tests/gen_common/gen_commands_common_validation.h" +#include "unit_tests/mocks/mock_buffer.h" #include "reg_configs_common.h" @@ -609,3 +610,76 @@ HWTEST_F(NegativeFailAllocationTest, givenEnqueueReadBufferRectWhenHostPtrAlloca EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal); } + +struct EnqueueReadBufferRectHw : public ::testing::Test { + + void SetUp() override { + if (is32bit) { + GTEST_SKIP(); + } + device.reset(MockDevice::createWithNewExecutionEnvironment(*platformDevices)); + context.reset(new MockContext(device.get())); + } + + std::unique_ptr device; + std::unique_ptr context; + MockBuffer srcBuffer; + + size_t bufferOrigin[3] = {0, 0, 0}; + size_t hostOrigin[3] = {0, 0, 0}; + size_t region[3] = {1, 1, 1}; + size_t bufferRowPitch = 10; + size_t bufferSlicePitch = 0; + size_t hostRowPitch = 10; + size_t hostSlicePitch = 10; + uint64_t bigSize = 4ull * MemoryConstants::gigaByte; + uint64_t smallSize = 4ull * MemoryConstants::gigaByte - 1; +}; + +using EnqeueReadBufferRectStatelessTest = EnqueueReadBufferRectHw; + +HWTEST_F(EnqeueReadBufferRectStatelessTest, WhenReadingBufferRectStatelessThenSuccessIsReturned) { + + auto pCmdQ = std::make_unique>(context.get(), device.get()); + void *missAlignedPtr = reinterpret_cast(0x1041); + srcBuffer.size = static_cast(bigSize); + auto retVal = pCmdQ->enqueueReadBufferRect(&srcBuffer, + CL_FALSE, + bufferOrigin, + hostOrigin, + region, + bufferRowPitch, + bufferSlicePitch, + hostRowPitch, + hostSlicePitch, + missAlignedPtr, + 0, + nullptr, + nullptr); + + EXPECT_EQ(CL_SUCCESS, retVal); +} + +using EnqeueReadBufferRectStatefulTest = EnqueueReadBufferRectHw; + +HWTEST_F(EnqeueReadBufferRectStatefulTest, WhenReadingBufferRectStatefulThenSuccessIsReturned) { + + auto pCmdQ = std::make_unique>(context.get(), device.get()); + void *missAlignedPtr = reinterpret_cast(0x1041); + srcBuffer.size = static_cast(smallSize); + auto retVal = pCmdQ->enqueueReadBufferRect(&srcBuffer, + CL_FALSE, + bufferOrigin, + hostOrigin, + region, + bufferRowPitch, + bufferSlicePitch, + hostRowPitch, + hostSlicePitch, + missAlignedPtr, + 0, + nullptr, + nullptr); + + EXPECT_EQ(CL_SUCCESS, retVal); +}