Skip to content

Commit 1135c10

Browse files
fix: set staging buffer writeable for aub and tbx
Signed-off-by: Szymon Morek <[email protected]>
1 parent 54e62da commit 1135c10

File tree

5 files changed

+49
-6
lines changed

5 files changed

+49
-6
lines changed

opencl/source/context/context.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -308,7 +308,8 @@ bool Context::createImpl(const cl_context_properties *properties,
308308
this->svmAllocsManager = new SVMAllocsManager(this->memoryManager,
309309
this->areMultiStorageAllocationsPreferred());
310310
this->svmAllocsManager->initUsmAllocationsCaches(device->getDevice());
311-
this->stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager, rootDeviceIndices, deviceBitfields);
311+
auto requiresWritableStaging = device->getDefaultEngine().commandStreamReceiver->getType() != CommandStreamReceiverType::hardware;
312+
this->stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager, rootDeviceIndices, deviceBitfields, requiresWritableStaging);
312313
}
313314
}
314315

opencl/test/unit_test/mocks/mock_context.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ void MockContext::initializeWithDevices(const ClDeviceVector &devices, bool noSp
125125
}
126126
deviceBitfields.insert({rootDeviceIndex, deviceBitfield});
127127
}
128-
stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager, rootDeviceIndices, deviceBitfields);
128+
stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager, rootDeviceIndices, deviceBitfields, true);
129129

130130
cl_int retVal;
131131
if (!noSpecialQueue) {

shared/source/utilities/staging_buffer_manager.cpp

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,8 @@ void StagingBufferTracker::freeChunk() const {
3131
allocator->free(chunkAddress, size);
3232
}
3333

34-
StagingBufferManager::StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map<uint32_t, DeviceBitfield> &deviceBitfields) : svmAllocsManager(svmAllocsManager), rootDeviceIndices(rootDeviceIndices), deviceBitfields(deviceBitfields) {
34+
StagingBufferManager::StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map<uint32_t, DeviceBitfield> &deviceBitfields, bool requiresWritable)
35+
: svmAllocsManager(svmAllocsManager), rootDeviceIndices(rootDeviceIndices), deviceBitfields(deviceBitfields), requiresWritable(requiresWritable) {
3536
if (debugManager.flags.StagingBufferSize.get() != -1) {
3637
chunkSize = debugManager.flags.StagingBufferSize.get() * MemoryConstants::kiloByte;
3738
}
@@ -240,6 +241,11 @@ std::pair<HeapAllocator *, uint64_t> StagingBufferManager::getExistingBuffer(siz
240241
allocator = stagingBuffer.getAllocator();
241242
buffer = allocator->allocate(size);
242243
if (buffer != 0) {
244+
if (requiresWritable) {
245+
auto alloc = svmAllocsManager->getSVMAlloc(stagingBuffer.getBaseAddress())->gpuAllocations.getDefaultGraphicsAllocation();
246+
alloc->setTbxWritable(true, std::numeric_limits<uint32_t>::max());
247+
alloc->setAubWritable(true, std::numeric_limits<uint32_t>::max());
248+
}
243249
break;
244250
}
245251
}

shared/source/utilities/staging_buffer_manager.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -71,7 +71,7 @@ using StagingQueue = std::queue<std::pair<UserDstData, StagingBufferTracker>>;
7171

7272
class StagingBufferManager {
7373
public:
74-
StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map<uint32_t, DeviceBitfield> &deviceBitfields);
74+
StagingBufferManager(SVMAllocsManager *svmAllocsManager, const RootDeviceIndicesContainer &rootDeviceIndices, const std::map<uint32_t, DeviceBitfield> &deviceBitfields, bool requiresWritable);
7575
~StagingBufferManager();
7676
StagingBufferManager(StagingBufferManager &&other) noexcept = delete;
7777
StagingBufferManager(const StagingBufferManager &other) = delete;
@@ -106,6 +106,7 @@ class StagingBufferManager {
106106
SVMAllocsManager *svmAllocsManager;
107107
const RootDeviceIndicesContainer rootDeviceIndices;
108108
const std::map<uint32_t, DeviceBitfield> deviceBitfields;
109+
const bool requiresWritable = false;
109110
};
110111

111112
} // namespace NEO

shared/test/unit_test/utilities/staging_buffer_manager_tests.cpp

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -29,7 +29,7 @@ class StagingBufferManagerFixture : public DeviceFixture {
2929
debugManager.flags.EnableCopyWithStagingBuffers.set(1);
3030
RootDeviceIndicesContainer rootDeviceIndices = {mockRootDeviceIndex};
3131
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, mockDeviceBitfield}};
32-
this->stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager.get(), rootDeviceIndices, deviceBitfields);
32+
this->stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager.get(), rootDeviceIndices, deviceBitfields, false);
3333
this->csr = pDevice->commandStreamReceivers[0].get();
3434
}
3535

@@ -211,6 +211,41 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferEnabledWhenValidForImageWrite
211211
svmAllocsManager->freeSVMAlloc(usmBuffer);
212212
}
213213

214+
TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformCopyOnHwThenDontSetWritable) {
215+
constexpr size_t numOfChunkCopies = 8;
216+
constexpr size_t remainder = 1024;
217+
constexpr size_t totalCopySize = stagingBufferSize * numOfChunkCopies + remainder;
218+
copyThroughStagingBuffers(totalCopySize, numOfChunkCopies + 1, 1, csr);
219+
auto svmData = svmAllocsManager->svmAllocs.allocations[0].second.get();
220+
auto alloc = svmData->gpuAllocations.getDefaultGraphicsAllocation();
221+
alloc->setAubWritable(false, std::numeric_limits<uint32_t>::max());
222+
alloc->setTbxWritable(false, std::numeric_limits<uint32_t>::max());
223+
copyThroughStagingBuffers(totalCopySize, numOfChunkCopies + 1, 0, csr);
224+
225+
EXPECT_FALSE(alloc->isAubWritable(std::numeric_limits<uint32_t>::max()));
226+
EXPECT_FALSE(alloc->isTbxWritable(std::numeric_limits<uint32_t>::max()));
227+
}
228+
229+
TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformCopyOnSimulationThenSetWritable) {
230+
constexpr size_t numOfChunkCopies = 8;
231+
constexpr size_t remainder = 1024;
232+
constexpr size_t totalCopySize = stagingBufferSize * numOfChunkCopies + remainder;
233+
234+
RootDeviceIndicesContainer rootDeviceIndices = {mockRootDeviceIndex};
235+
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, mockDeviceBitfield}};
236+
stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager.get(), rootDeviceIndices, deviceBitfields, true);
237+
238+
copyThroughStagingBuffers(totalCopySize, numOfChunkCopies + 1, 1, csr);
239+
auto svmData = svmAllocsManager->svmAllocs.allocations[0].second.get();
240+
auto alloc = svmData->gpuAllocations.getDefaultGraphicsAllocation();
241+
alloc->setAubWritable(false, std::numeric_limits<uint32_t>::max());
242+
alloc->setTbxWritable(false, std::numeric_limits<uint32_t>::max());
243+
copyThroughStagingBuffers(totalCopySize, numOfChunkCopies + 1, 0, csr);
244+
245+
EXPECT_TRUE(alloc->isAubWritable(std::numeric_limits<uint32_t>::max()));
246+
EXPECT_TRUE(alloc->isTbxWritable(std::numeric_limits<uint32_t>::max()));
247+
}
248+
214249
TEST_F(StagingBufferManagerTest, givenStagingBufferWhenPerformCopyThenCopyData) {
215250
constexpr size_t numOfChunkCopies = 8;
216251
constexpr size_t remainder = 1024;
@@ -336,7 +371,7 @@ TEST_F(StagingBufferManagerTest, givenStagingBufferWhenChangedBufferSizeThenPerf
336371

337372
RootDeviceIndicesContainer rootDeviceIndices = {mockRootDeviceIndex};
338373
std::map<uint32_t, DeviceBitfield> deviceBitfields{{mockRootDeviceIndex, mockDeviceBitfield}};
339-
stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager.get(), rootDeviceIndices, deviceBitfields);
374+
stagingBufferManager = std::make_unique<StagingBufferManager>(svmAllocsManager.get(), rootDeviceIndices, deviceBitfields, false);
340375
copyThroughStagingBuffers(totalCopySize, numOfChunkCopies + 1, 1, csr);
341376
}
342377

0 commit comments

Comments
 (0)