Skip to content

Commit f76c0e8

Browse files
Don't copy compressed buffer on CPU
Change-Id: I9c36ee8f23284286bb846fd9a0fd196733d0f8f9 Signed-off-by: Mateusz Jablonski <[email protected]>
1 parent 3c8b3e9 commit f76c0e8

File tree

6 files changed

+94
-4
lines changed

6 files changed

+94
-4
lines changed

runtime/command_queue/command_queue.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -304,7 +304,7 @@ class CommandQueue : public BaseObject<_cl_command_queue> {
304304
cl_event *oclEvent,
305305
cl_uint cmdType);
306306

307-
void *cpuDataTransferHandler(TransferProperties &transferProperties, EventsRequest &eventsRequest, cl_int &retVal);
307+
MOCKABLE_VIRTUAL void *cpuDataTransferHandler(TransferProperties &transferProperties, EventsRequest &eventsRequest, cl_int &retVal);
308308

309309
virtual cl_int finish(bool dcFlush) { return CL_SUCCESS; }
310310

runtime/command_queue/enqueue_read_buffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,8 @@ cl_int CommandQueueHw<GfxFamily>::enqueueReadBuffer(
3636

3737
cl_int retVal = CL_SUCCESS;
3838
bool isMemTransferNeeded = buffer->isMemObjZeroCopy() ? buffer->checkIfMemoryTransferIsRequired(offset, 0, ptr, CL_COMMAND_READ_BUFFER) : true;
39-
if (((DebugManager.flags.DoCpuCopyOnReadBuffer.get() && !Event::checkUserEventDependencies(numEventsInWaitList, eventWaitList)) ||
39+
if (((DebugManager.flags.DoCpuCopyOnReadBuffer.get() && !Event::checkUserEventDependencies(numEventsInWaitList, eventWaitList) &&
40+
buffer->getGraphicsAllocation()->getAllocationType() != GraphicsAllocation::AllocationType::BUFFER_COMPRESSED) ||
4041
buffer->isReadWriteOnCpuAllowed(blockingRead, numEventsInWaitList, ptr, size)) &&
4142
context->getDevice(0)->getDeviceInfo().cpuCopyAllowed) {
4243
if (!isMemTransferNeeded) {

runtime/command_queue/enqueue_write_buffer.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,8 @@ cl_int CommandQueueHw<GfxFamily>::enqueueWriteBuffer(
3333

3434
cl_int retVal = CL_SUCCESS;
3535
auto isMemTransferNeeded = buffer->isMemObjZeroCopy() ? buffer->checkIfMemoryTransferIsRequired(offset, 0, ptr, CL_COMMAND_READ_BUFFER) : true;
36-
if (((DebugManager.flags.DoCpuCopyOnWriteBuffer.get() && !Event::checkUserEventDependencies(numEventsInWaitList, eventWaitList)) ||
36+
if (((DebugManager.flags.DoCpuCopyOnWriteBuffer.get() && !Event::checkUserEventDependencies(numEventsInWaitList, eventWaitList) &&
37+
buffer->getGraphicsAllocation()->getAllocationType() != GraphicsAllocation::AllocationType::BUFFER_COMPRESSED) ||
3738
buffer->isReadWriteOnCpuAllowed(blockingWrite, numEventsInWaitList, const_cast<void *>(ptr), size)) &&
3839
context->getDevice(0)->getDeviceInfo().cpuCopyAllowed) {
3940
if (!isMemTransferNeeded) {

unit_tests/command_queue/enqueue_read_buffer_tests.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -482,6 +482,48 @@ HWTEST_F(EnqueueReadBufferTypeTest, givenEnqueueReadBufferCalledWhenLockedPtrInT
482482
EXPECT_EQ(0u, memoryManager.unlockResourceCalled);
483483
}
484484

485+
HWTEST_F(EnqueueReadBufferTypeTest, givenForcedCpuCopyWhenEnqueueReadCompressedBufferThenDontCopyOnCpu) {
486+
DebugManagerStateRestore dbgRestore;
487+
DebugManager.flags.DoCpuCopyOnReadBuffer.set(true);
488+
489+
MockExecutionEnvironment executionEnvironment(*platformDevices);
490+
MockMemoryManager memoryManager(false, true, executionEnvironment);
491+
MockContext ctx;
492+
cl_int retVal;
493+
ctx.setMemoryManager(&memoryManager);
494+
auto mockCmdQ = std::make_unique<MockCommandQueueHw<FamilyType>>(context, pDevice, nullptr);
495+
std::unique_ptr<Buffer> buffer(Buffer::create(&ctx, 0, 1, nullptr, retVal));
496+
static_cast<MemoryAllocation *>(buffer->getGraphicsAllocation())->overrideMemoryPool(MemoryPool::SystemCpuInaccessible);
497+
void *ptr = nonZeroCopyBuffer->getCpuAddressForMemoryTransfer();
498+
buffer->getGraphicsAllocation()->setAllocationType(GraphicsAllocation::AllocationType::BUFFER_COMPRESSED);
499+
500+
retVal = mockCmdQ->enqueueReadBuffer(buffer.get(),
501+
CL_TRUE,
502+
0,
503+
MemoryConstants::cacheLineSize,
504+
ptr,
505+
0,
506+
nullptr,
507+
nullptr);
508+
509+
EXPECT_EQ(CL_SUCCESS, retVal);
510+
EXPECT_FALSE(mockCmdQ->cpuDataTransferHandlerCalled);
511+
512+
buffer->getGraphicsAllocation()->setAllocationType(GraphicsAllocation::AllocationType::BUFFER);
513+
514+
retVal = mockCmdQ->enqueueReadBuffer(buffer.get(),
515+
CL_TRUE,
516+
0,
517+
MemoryConstants::cacheLineSize,
518+
ptr,
519+
0,
520+
nullptr,
521+
nullptr);
522+
523+
EXPECT_EQ(CL_SUCCESS, retVal);
524+
EXPECT_TRUE(mockCmdQ->cpuDataTransferHandlerCalled);
525+
}
526+
485527
HWTEST_F(EnqueueReadBufferTypeTest, gicenEnqueueReadBufferCalledWhenLockedPtrInTransferPropertisIsNotAvailableThenItIsNotUnlocked) {
486528
DebugManagerStateRestore dbgRestore;
487529
DebugManager.flags.DoCpuCopyOnReadBuffer.set(true);

unit_tests/command_queue/enqueue_write_buffer_tests.cpp

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -391,6 +391,48 @@ HWTEST_F(EnqueueWriteBufferTypeTest, givenEnqueueWriteBufferCalledWhenLockedPtrI
391391
EXPECT_EQ(0u, memoryManager.unlockResourceCalled);
392392
}
393393

394+
HWTEST_F(EnqueueWriteBufferTypeTest, givenForcedCpuCopyWhenEnqueueWriteCompressedBufferThenDontCopyOnCpu) {
395+
DebugManagerStateRestore dbgRestore;
396+
DebugManager.flags.DoCpuCopyOnWriteBuffer.set(true);
397+
398+
MockExecutionEnvironment executionEnvironment(*platformDevices);
399+
MockMemoryManager memoryManager(false, true, executionEnvironment);
400+
MockContext ctx;
401+
cl_int retVal;
402+
ctx.setMemoryManager(&memoryManager);
403+
auto mockCmdQ = std::make_unique<MockCommandQueueHw<FamilyType>>(context, pDevice, nullptr);
404+
std::unique_ptr<Buffer> buffer(Buffer::create(&ctx, 0, 1, nullptr, retVal));
405+
static_cast<MemoryAllocation *>(buffer->getGraphicsAllocation())->overrideMemoryPool(MemoryPool::SystemCpuInaccessible);
406+
void *ptr = srcBuffer->getCpuAddressForMemoryTransfer();
407+
buffer->getGraphicsAllocation()->setAllocationType(GraphicsAllocation::AllocationType::BUFFER_COMPRESSED);
408+
409+
retVal = mockCmdQ->enqueueWriteBuffer(buffer.get(),
410+
CL_FALSE,
411+
0,
412+
MemoryConstants::cacheLineSize,
413+
ptr,
414+
0,
415+
nullptr,
416+
nullptr);
417+
418+
EXPECT_EQ(CL_SUCCESS, retVal);
419+
EXPECT_FALSE(mockCmdQ->cpuDataTransferHandlerCalled);
420+
421+
buffer->getGraphicsAllocation()->setAllocationType(GraphicsAllocation::AllocationType::BUFFER);
422+
423+
retVal = mockCmdQ->enqueueWriteBuffer(buffer.get(),
424+
CL_FALSE,
425+
0,
426+
MemoryConstants::cacheLineSize,
427+
ptr,
428+
0,
429+
nullptr,
430+
nullptr);
431+
432+
EXPECT_EQ(CL_SUCCESS, retVal);
433+
EXPECT_TRUE(mockCmdQ->cpuDataTransferHandlerCalled);
434+
}
435+
394436
HWTEST_F(EnqueueWriteBufferTypeTest, givenEnqueueWriteBufferCalledWhenLockedPtrInTransferPropertisIsNotAvailableThenItIsNotUnlocked) {
395437
DebugManagerStateRestore dbgRestore;
396438
DebugManager.flags.DoCpuCopyOnWriteBuffer.set(true);

unit_tests/mocks/mock_command_queue.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -109,7 +109,10 @@ class MockCommandQueueHw : public CommandQueueHw<GfxFamily> {
109109
eventWaitList,
110110
event);
111111
}
112-
112+
void *cpuDataTransferHandler(TransferProperties &transferProperties, EventsRequest &eventsRequest, cl_int &retVal) override {
113+
cpuDataTransferHandlerCalled = true;
114+
return BaseClass::cpuDataTransferHandler(transferProperties, eventsRequest, retVal);
115+
}
113116
cl_int enqueueWriteBuffer(Buffer *buffer, cl_bool blockingWrite, size_t offset, size_t size,
114117
const void *ptr, cl_uint numEventsInWaitList, const cl_event *eventWaitList, cl_event *event) override {
115118
EnqueueWriteBufferCounter++;
@@ -138,6 +141,7 @@ class MockCommandQueueHw : public CommandQueueHw<GfxFamily> {
138141
bool blockingWriteBuffer = false;
139142
bool notifyEnqueueReadBufferCalled = false;
140143
bool notifyEnqueueReadImageCalled = false;
144+
bool cpuDataTransferHandlerCalled = false;
141145
uint32_t completionStampTaskCount = 0;
142146
uint32_t deltaTaskCount = 0;
143147

0 commit comments

Comments
 (0)