Allocate internal allocations through preferred pool

Change-Id: Ib17431ceefc1eb72f86625e0998f679baaa7cb0d
Signed-off-by: Mateusz Jablonski <mateusz.jablonski@intel.com>
This commit is contained in:
Mateusz Jablonski
2018-12-21 10:16:27 +01:00
committed by sys_ocldev
parent 303014582a
commit f157943610
25 changed files with 119 additions and 68 deletions

View File

@@ -64,6 +64,8 @@ class GraphicsAllocation : public IDNode<GraphicsAllocation> {
DYNAMIC_STATE_HEAP,
SHARED_RESOURCE_COPY,
SVM,
KERNEL_ISA,
INTERNAL_HEAP,
UNDECIDED,
};

View File

@@ -260,12 +260,23 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo
case GraphicsAllocation::AllocationType::LINEAR_STREAM:
case GraphicsAllocation::AllocationType::FILL_PATTERN:
case GraphicsAllocation::AllocationType::TIMESTAMP_TAG_BUFFER:
case GraphicsAllocation::AllocationType::KERNEL_ISA:
case GraphicsAllocation::AllocationType::INTERNAL_HEAP:
allocationData.flags.useSystemMemory = true;
break;
default:
break;
}
switch (properties.allocationType) {
case GraphicsAllocation::AllocationType::KERNEL_ISA:
case GraphicsAllocation::AllocationType::INTERNAL_HEAP:
allocationData.allocationOrigin = AllocationOrigin::INTERNAL_ALLOCATION;
break;
default:
break;
}
allocationData.flags.mustBeZeroCopy = mustBeZeroCopy;
allocationData.flags.allocateMemory = properties.flags.allocateMemory;
allocationData.flags.allow32Bit = allow32Bit;
@@ -315,8 +326,9 @@ GraphicsAllocation *MemoryManager::allocateGraphicsMemory(const AllocationData &
return allocateGraphicsMemoryForImage(allocationData);
}
if (force32bitAllocations && allocationData.flags.allow32Bit && is64bit) {
return allocate32BitGraphicsMemory(allocationData.size, allocationData.hostPtr, AllocationOrigin::EXTERNAL_ALLOCATION);
if (allocationData.allocationOrigin == AllocationOrigin::INTERNAL_ALLOCATION ||
(force32bitAllocations && allocationData.flags.allow32Bit && is64bit)) {
return allocate32BitGraphicsMemoryImpl(allocationData);
}
if (allocationData.hostPtr) {
return allocateGraphicsMemoryWithHostPtr(allocationData);

View File

@@ -36,7 +36,7 @@ enum AllocationUsage {
REUSABLE_ALLOCATION
};
enum AllocationOrigin {
enum class AllocationOrigin {
EXTERNAL_ALLOCATION,
INTERNAL_ALLOCATION
};
@@ -117,8 +117,6 @@ class MemoryManager {
}
}
virtual GraphicsAllocation *allocate32BitGraphicsMemory(size_t size, const void *ptr, AllocationOrigin allocationOrigin) = 0;
GraphicsAllocation *allocateGraphicsMemoryInPreferredPool(AllocationProperties properties, DevicesBitfield devicesBitfield, const void *hostPtr);
virtual GraphicsAllocation *createGraphicsAllocationFromSharedHandle(osHandle handle, bool requireSpecificBitness) = 0;
@@ -212,6 +210,7 @@ class MemoryManager {
};
static_assert(sizeof(AllocationData::flags) == sizeof(AllocationData::allFlags), "");
GraphicsAllocation::AllocationType type = GraphicsAllocation::AllocationType::UNKNOWN;
AllocationOrigin allocationOrigin = AllocationOrigin::EXTERNAL_ALLOCATION;
const void *hostPtr = nullptr;
size_t size = 0;
size_t alignment = 0;
@@ -227,6 +226,7 @@ class MemoryManager {
virtual GraphicsAllocation *allocateGraphicsMemoryWithHostPtr(const AllocationData &allocationData);
virtual GraphicsAllocation *allocateGraphicsMemoryWithAlignment(const AllocationData &allocationData) = 0;
virtual GraphicsAllocation *allocateGraphicsMemory64kb(AllocationData allocationData) = 0;
virtual GraphicsAllocation *allocate32BitGraphicsMemoryImpl(const AllocationData &allocationData) = 0;
virtual GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) {
status = AllocationStatus::Error;
switch (allocationData.type) {

View File

@@ -78,15 +78,15 @@ GraphicsAllocation *OsAgnosticMemoryManager::allocateGraphicsMemory64kb(Allocati
return memoryAllocation;
}
GraphicsAllocation *OsAgnosticMemoryManager::allocate32BitGraphicsMemory(size_t size, const void *ptr, AllocationOrigin allocationOrigin) {
if (ptr) {
auto allocationSize = alignSizeWholePage(ptr, size);
GraphicsAllocation *OsAgnosticMemoryManager::allocate32BitGraphicsMemoryImpl(const AllocationData &allocationData) {
if (allocationData.hostPtr) {
auto allocationSize = alignSizeWholePage(allocationData.hostPtr, allocationData.size);
auto gpuVirtualAddress = allocator32Bit->allocate(allocationSize);
if (!gpuVirtualAddress) {
return nullptr;
}
uint64_t offset = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(ptr) & MemoryConstants::pageMask);
MemoryAllocation *memAlloc = new MemoryAllocation(nullptr, const_cast<void *>(ptr), GmmHelper::canonize(gpuVirtualAddress + offset), size,
uint64_t offset = static_cast<uint64_t>(reinterpret_cast<uintptr_t>(allocationData.hostPtr) & MemoryConstants::pageMask);
MemoryAllocation *memAlloc = new MemoryAllocation(nullptr, const_cast<void *>(allocationData.hostPtr), GmmHelper::canonize(gpuVirtualAddress + offset), allocationData.size,
counter, MemoryPool::System4KBPagesWith32BitGpuAddressing, this->getOsContextCount(), false);
memAlloc->is32BitAllocation = true;
memAlloc->gpuBaseAddress = GmmHelper::canonize(allocator32Bit->getBase());
@@ -96,17 +96,17 @@ GraphicsAllocation *OsAgnosticMemoryManager::allocate32BitGraphicsMemory(size_t
return memAlloc;
}
auto allocationSize = alignUp(size, MemoryConstants::pageSize);
auto allocationSize = alignUp(allocationData.size, MemoryConstants::pageSize);
void *ptrAlloc = nullptr;
auto gpuAddress = allocator32Bit->allocate(allocationSize);
if (size < 0xfffff000) {
if (allocationData.size < 0xfffff000) {
ptrAlloc = alignedMallocWrapper(allocationSize, MemoryConstants::allocationAlignment);
}
MemoryAllocation *memoryAllocation = nullptr;
if (ptrAlloc != nullptr) {
memoryAllocation = new MemoryAllocation(ptrAlloc, ptrAlloc, GmmHelper::canonize(gpuAddress), size, counter,
memoryAllocation = new MemoryAllocation(ptrAlloc, ptrAlloc, GmmHelper::canonize(gpuAddress), allocationData.size, counter,
MemoryPool::System4KBPagesWith32BitGpuAddressing, this->getOsContextCount(), false);
memoryAllocation->is32BitAllocation = true;
memoryAllocation->gpuBaseAddress = GmmHelper::canonize(allocator32Bit->getBase());

View File

@@ -45,10 +45,8 @@ class OsAgnosticMemoryManager : public MemoryManager {
~OsAgnosticMemoryManager() override;
GraphicsAllocation *allocateGraphicsMemoryForNonSvmHostPtr(size_t size, void *cpuPtr) override;
GraphicsAllocation *allocate32BitGraphicsMemory(size_t size, const void *ptr, AllocationOrigin allocationOrigin) override;
GraphicsAllocation *createGraphicsAllocationFromSharedHandle(osHandle handle, bool requireSpecificBitness) override;
GraphicsAllocation *createGraphicsAllocationFromNTHandle(void *handle) override { return nullptr; }
GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override;
void addAllocationToHostPtrManager(GraphicsAllocation *gfxAllocation) override;
void removeAllocationFromHostPtrManager(GraphicsAllocation *gfxAllocation) override;
@@ -74,6 +72,8 @@ class OsAgnosticMemoryManager : public MemoryManager {
void *lockResourceImpl(GraphicsAllocation &graphicsAllocation) override { return ptrOffset(graphicsAllocation.getUnderlyingBuffer(), static_cast<size_t>(graphicsAllocation.allocationOffset)); };
void unlockResourceImpl(GraphicsAllocation &graphicsAllocation) override{};
GraphicsAllocation *allocate32BitGraphicsMemoryImpl(const AllocationData &allocationData) override;
GraphicsAllocation *allocateGraphicsMemoryInDevicePool(const AllocationData &allocationData, AllocationStatus &status) override;
private:
unsigned long long counter = 0;