Add support for stateless read buffer rect

Change-Id: I794be4cacaa9de661c0c7e6ec67da85b0d5eed9a
Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com>
Related-To: NEO-3314
This commit is contained in:
Kamil Kopryk
2019-11-04 21:02:22 +01:00
committed by sys_ocldev
parent 3f42625dcc
commit 0ef81b2bc0
2 changed files with 84 additions and 3 deletions

View File

@@ -34,7 +34,6 @@ cl_int CommandQueueHw<GfxFamily>::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<GfxFamily>::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<GfxFamily>::enqueueReadBufferRect(
dc.srcSlicePitch = bufferSlicePitch;
dc.dstRowPitch = hostRowPitch;
dc.dstSlicePitch = hostSlicePitch;
MultiDispatchInfo dispatchInfo;
builder.buildDispatchInfos(dispatchInfo, dc);
enqueueHandler<CL_COMMAND_READ_BUFFER_RECT>(

View File

@@ -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<MockDevice>(*platformDevices));
context.reset(new MockContext(device.get()));
}
std::unique_ptr<MockDevice> device;
std::unique_ptr<MockContext> 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<CommandQueueStateless<FamilyType>>(context.get(), device.get());
void *missAlignedPtr = reinterpret_cast<void *>(0x1041);
srcBuffer.size = static_cast<size_t>(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<CommandQueueStateful<FamilyType>>(context.get(), device.get());
void *missAlignedPtr = reinterpret_cast<void *>(0x1041);
srcBuffer.size = static_cast<size_t>(smallSize);
auto retVal = pCmdQ->enqueueReadBufferRect(&srcBuffer,
CL_FALSE,
bufferOrigin,
hostOrigin,
region,
bufferRowPitch,
bufferSlicePitch,
hostRowPitch,
hostSlicePitch,
missAlignedPtr,
0,
nullptr,
nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
}