Add support for stateless write buffer rect

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

View File

@@ -33,7 +33,6 @@ cl_int CommandQueueHw<GfxFamily>::enqueueWriteBufferRect(
const cl_event *eventWaitList,
cl_event *event) {
MultiDispatchInfo dispatchInfo;
auto isMemTransferNeeded = true;
if (buffer->isMemObjZeroCopy()) {
size_t bufferOffset;
@@ -45,8 +44,14 @@ cl_int CommandQueueHw<GfxFamily>::enqueueWriteBufferRect(
return enqueueMarkerForReadWriteOperation(buffer, const_cast<void *>(ptr), CL_COMMAND_WRITE_BUFFER_RECT, blockingWrite,
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);
@@ -80,6 +85,8 @@ cl_int CommandQueueHw<GfxFamily>::enqueueWriteBufferRect(
dc.srcSlicePitch = hostSlicePitch;
dc.dstRowPitch = bufferRowPitch;
dc.dstSlicePitch = bufferSlicePitch;
MultiDispatchInfo dispatchInfo;
builder.buildDispatchInfos(dispatchInfo, dc);
enqueueHandler<CL_COMMAND_WRITE_BUFFER_RECT>(

View File

@@ -14,6 +14,7 @@
#include "unit_tests/fixtures/buffer_enqueue_fixture.h"
#include "unit_tests/fixtures/buffer_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, givenEnqueueWriteBufferRectWhenHostPtrAlloc
EXPECT_EQ(CL_OUT_OF_RESOURCES, retVal);
}
struct EnqueueWriteBufferRectHw : 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 EnqeueWriteBufferRectStatelessTest = EnqueueWriteBufferRectHw;
HWTEST_F(EnqeueWriteBufferRectStatelessTest, WhenWritingBufferRectStatelessThenSuccessIsReturned) {
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->enqueueWriteBufferRect(&srcBuffer,
CL_FALSE,
bufferOrigin,
hostOrigin,
region,
bufferRowPitch,
bufferSlicePitch,
hostRowPitch,
hostSlicePitch,
missAlignedPtr,
0,
nullptr,
nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
}
using EnqeueWriteBufferRectStatefulTest = EnqueueWriteBufferRectHw;
HWTEST_F(EnqeueWriteBufferRectStatefulTest, WhenWritingBufferRectStatefulThenSuccessIsReturned) {
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->enqueueWriteBufferRect(&srcBuffer,
CL_FALSE,
bufferOrigin,
hostOrigin,
region,
bufferRowPitch,
bufferSlicePitch,
hostRowPitch,
hostSlicePitch,
missAlignedPtr,
0,
nullptr,
nullptr);
EXPECT_EQ(CL_SUCCESS, retVal);
}