mirror of
https://github.com/intel/compute-runtime.git
synced 2025-12-20 08:53:55 +08:00
Re-use temporary allocations
Resolves: NEO-4123 Change-Id: I44e9de4f1bf576adbbe8d69d1ec2c6ae1bbca35f Signed-off-by: Lukasz Jobczyk <lukasz.jobczyk@intel.com>
This commit is contained in:
committed by
sys_ocldev
parent
11edcd8fc9
commit
eabed40e3e
@@ -421,29 +421,34 @@ AllocationsList &CommandStreamReceiver::getTemporaryAllocations() { return inter
|
||||
AllocationsList &CommandStreamReceiver::getAllocationsForReuse() { return internalAllocationStorage->getAllocationsForReuse(); }
|
||||
|
||||
bool CommandStreamReceiver::createAllocationForHostSurface(HostPtrSurface &surface, bool requiresL3Flush) {
|
||||
auto memoryManager = getMemoryManager();
|
||||
AllocationProperties properties{rootDeviceIndex,
|
||||
false, // allocateMemory
|
||||
surface.getSurfaceSize(), GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR,
|
||||
false, // isMultiStorageAllocation
|
||||
osContext->getDeviceBitfield()};
|
||||
properties.flags.flushL3RequiredForRead = properties.flags.flushL3RequiredForWrite = requiresL3Flush;
|
||||
auto allocation = memoryManager->allocateGraphicsMemoryWithProperties(properties, surface.getMemoryPointer());
|
||||
if (allocation == nullptr && surface.peekIsPtrCopyAllowed()) {
|
||||
// Try with no host pointer allocation and copy
|
||||
AllocationProperties copyProperties{rootDeviceIndex, surface.getSurfaceSize(), GraphicsAllocation::AllocationType::INTERNAL_HOST_MEMORY};
|
||||
copyProperties.alignment = MemoryConstants::pageSize;
|
||||
allocation = memoryManager->allocateGraphicsMemoryWithProperties(copyProperties);
|
||||
if (allocation) {
|
||||
memcpy_s(allocation->getUnderlyingBuffer(), allocation->getUnderlyingBufferSize(), surface.getMemoryPointer(), surface.getSurfaceSize());
|
||||
auto allocation = internalAllocationStorage->obtainTemporaryAllocationWithPtr(surface.getSurfaceSize(), surface.getMemoryPointer(), GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR);
|
||||
|
||||
if (allocation == nullptr) {
|
||||
auto memoryManager = getMemoryManager();
|
||||
AllocationProperties properties{rootDeviceIndex,
|
||||
false, // allocateMemory
|
||||
surface.getSurfaceSize(), GraphicsAllocation::AllocationType::EXTERNAL_HOST_PTR,
|
||||
false, // isMultiStorageAllocation
|
||||
osContext->getDeviceBitfield()};
|
||||
properties.flags.flushL3RequiredForRead = properties.flags.flushL3RequiredForWrite = requiresL3Flush;
|
||||
allocation.reset(memoryManager->allocateGraphicsMemoryWithProperties(properties, surface.getMemoryPointer()));
|
||||
if (allocation == nullptr && surface.peekIsPtrCopyAllowed()) {
|
||||
// Try with no host pointer allocation and copy
|
||||
AllocationProperties copyProperties{rootDeviceIndex, surface.getSurfaceSize(), GraphicsAllocation::AllocationType::INTERNAL_HOST_MEMORY};
|
||||
copyProperties.alignment = MemoryConstants::pageSize;
|
||||
allocation.reset(memoryManager->allocateGraphicsMemoryWithProperties(copyProperties));
|
||||
if (allocation) {
|
||||
memcpy_s(allocation->getUnderlyingBuffer(), allocation->getUnderlyingBufferSize(), surface.getMemoryPointer(), surface.getSurfaceSize());
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (allocation == nullptr) {
|
||||
return false;
|
||||
}
|
||||
allocation->updateTaskCount(CompletionStamp::levelNotReady, osContext->getContextId());
|
||||
surface.setAllocation(allocation);
|
||||
internalAllocationStorage->storeAllocation(std::unique_ptr<GraphicsAllocation>(allocation), TEMPORARY_ALLOCATION);
|
||||
surface.setAllocation(allocation.get());
|
||||
internalAllocationStorage->storeAllocation(std::move(allocation), TEMPORARY_ALLOCATION);
|
||||
return true;
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user