mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-25 05:24:02 +08:00
Add support for stateless copy buffer to buffer
Change-Id: I7ad19890ea1725bcecf17aee16abe1f993f5b08c Signed-off-by: Kamil Kopryk <kamil.kopryk@intel.com> Related-To: NEO-3314
This commit is contained in:
@@ -8,6 +8,7 @@
|
||||
#include "core/helpers/ptr_math.h"
|
||||
#include "runtime/built_ins/built_ins.h"
|
||||
#include "runtime/built_ins/builtins_dispatch_builder.h"
|
||||
#include "runtime/command_queue/command_queue_hw.h"
|
||||
#include "runtime/helpers/dispatch_info.h"
|
||||
#include "runtime/kernel/kernel.h"
|
||||
#include "test.h"
|
||||
@@ -138,7 +139,7 @@ HWTEST_F(EnqueueCopyBufferTest, WhenCopyingBufferThenIndirectDataGetsAdded) {
|
||||
|
||||
BuiltinOpParams dc;
|
||||
dc.srcMemObj = srcBuffer;
|
||||
dc.srcMemObj = dstBuffer;
|
||||
dc.dstMemObj = dstBuffer;
|
||||
dc.srcOffset = {EnqueueCopyBufferTraits::srcOffset, 0, 0};
|
||||
dc.dstOffset = {EnqueueCopyBufferTraits::dstOffset, 0, 0};
|
||||
dc.size = {EnqueueCopyBufferTraits::size, 0, 0};
|
||||
@@ -154,6 +155,30 @@ HWTEST_F(EnqueueCopyBufferTest, WhenCopyingBufferThenIndirectDataGetsAdded) {
|
||||
}
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueCopyBufferTest, WhenCopyingBufferStatelessThenStatelessKernelIsUsed) {
|
||||
|
||||
auto srcBuffer = std::unique_ptr<Buffer>(BufferHelper<>::create());
|
||||
auto dstBuffer = std::unique_ptr<Buffer>(BufferHelper<>::create());
|
||||
|
||||
MultiDispatchInfo multiDispatchInfo;
|
||||
auto &builder = pDevice->getExecutionEnvironment()->getBuiltIns()->getBuiltinDispatchInfoBuilder(EBuiltInOps::CopyBufferToBufferStateless,
|
||||
pCmdQ->getContext(), pCmdQ->getDevice());
|
||||
|
||||
ASSERT_NE(nullptr, &builder);
|
||||
BuiltinOpParams dc;
|
||||
dc.srcMemObj = srcBuffer.get();
|
||||
dc.dstMemObj = dstBuffer.get();
|
||||
dc.srcOffset = {EnqueueCopyBufferTraits::srcOffset, 0, 0};
|
||||
dc.dstOffset = {EnqueueCopyBufferTraits::dstOffset, 0, 0};
|
||||
dc.size = {EnqueueCopyBufferTraits::size, 0, 0};
|
||||
builder.buildDispatchInfos(multiDispatchInfo, dc);
|
||||
EXPECT_NE(0u, multiDispatchInfo.size());
|
||||
|
||||
auto kernel = multiDispatchInfo.begin()->getKernel();
|
||||
EXPECT_TRUE(kernel->getKernelInfo().patchInfo.executionEnvironment->CompiledForGreaterThan4GBBuffers);
|
||||
EXPECT_FALSE(kernel->getKernelInfo().kernelArgInfo[0].pureStatefulBufferAccess);
|
||||
}
|
||||
|
||||
HWTEST_F(EnqueueCopyBufferTest, WhenCopyingBufferThenL3ProgrammingIsCorrect) {
|
||||
enqueueCopyBufferAndParse<FamilyType>();
|
||||
validateL3Programming<FamilyType>(cmdList, itorWalker);
|
||||
@@ -273,3 +298,83 @@ HWTEST_F(EnqueueCopyBufferTest, WhenCopyingBufferThenArgumentOneMatchesDestinati
|
||||
|
||||
EXPECT_EQ((void *)((uintptr_t)dstBuffer->getGraphicsAllocation()->getGpuAddress()), *pArgument);
|
||||
}
|
||||
|
||||
struct EnqueueCopyBufferHw : public ::testing::Test {
|
||||
template <typename FamilyType>
|
||||
struct MyCmdQStateless : public CommandQueueHw<FamilyType> {
|
||||
using CommandQueueHw<FamilyType>::commandStream;
|
||||
MyCmdQStateless(Context *context, Device *device) : CommandQueueHw<FamilyType>(context, device, nullptr){};
|
||||
|
||||
bool forceStateless(size_t size) override {
|
||||
return true;
|
||||
}
|
||||
};
|
||||
|
||||
template <typename FamilyType>
|
||||
struct MyCmdQStatefull : public CommandQueueHw<FamilyType> {
|
||||
using CommandQueueHw<FamilyType>::commandStream;
|
||||
MyCmdQStatefull(Context *context, Device *device) : CommandQueueHw<FamilyType>(context, device, nullptr){};
|
||||
|
||||
bool forceStateless(size_t size) override {
|
||||
return false;
|
||||
}
|
||||
};
|
||||
|
||||
void SetUp() override {
|
||||
device.reset(MockDevice::createWithNewExecutionEnvironment<MockDevice>(*platformDevices));
|
||||
context.reset(new MockContext(device.get()));
|
||||
|
||||
srcBuffer = std::unique_ptr<Buffer>(BufferHelper<>::create(context.get()));
|
||||
dstBuffer = std::unique_ptr<Buffer>(BufferHelper<>::create(context.get()));
|
||||
}
|
||||
|
||||
std::unique_ptr<MockDevice> device;
|
||||
std::unique_ptr<MockContext> context;
|
||||
std::unique_ptr<Buffer> srcBuffer;
|
||||
std::unique_ptr<Buffer> dstBuffer;
|
||||
};
|
||||
|
||||
using EnqueueCopyBufferStatelessTest = EnqueueCopyBufferHw;
|
||||
|
||||
HWTEST_F(EnqueueCopyBufferStatelessTest, givenBuffersWhenCopyingBufferStatelessThenSuccessIsReturned) {
|
||||
|
||||
if (is32bit) {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
auto cmdQ = std::make_unique<MyCmdQStateless<FamilyType>>(context.get(), device.get());
|
||||
|
||||
auto retVal = cmdQ->enqueueCopyBuffer(
|
||||
srcBuffer.get(),
|
||||
dstBuffer.get(),
|
||||
0,
|
||||
0,
|
||||
sizeof(float),
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
}
|
||||
|
||||
using EnqueueCopyBufferStatefullTest = EnqueueCopyBufferHw;
|
||||
|
||||
HWTEST_F(EnqueueCopyBufferStatefullTest, givenBuffersWhenCopyingBufferStatefullThenSuccessIsReturned) {
|
||||
|
||||
if (is32bit) {
|
||||
GTEST_SKIP();
|
||||
}
|
||||
|
||||
auto cmdQ = std::make_unique<MyCmdQStatefull<FamilyType>>(context.get(), device.get());
|
||||
|
||||
auto retVal = cmdQ->enqueueCopyBuffer(
|
||||
srcBuffer.get(),
|
||||
dstBuffer.get(),
|
||||
0,
|
||||
0,
|
||||
sizeof(float),
|
||||
0,
|
||||
nullptr,
|
||||
nullptr);
|
||||
|
||||
EXPECT_EQ(CL_SUCCESS, retVal);
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user