From e8b6f11cad0af82c221bd3616c48e0cfad31c412 Mon Sep 17 00:00:00 2001 From: "Hoppe, Mateusz" Date: Thu, 20 Sep 2018 21:07:50 -0700 Subject: [PATCH] Propagate AllocationFlags and deviceIndex to GraphicsAllocation - adjust AllocationData interface Change-Id: I3754585011d34b747fe23836f754fba8e711c9ff --- runtime/memory_manager/graphics_allocation.h | 6 +- runtime/memory_manager/memory_manager.cpp | 11 ++- runtime/memory_manager/memory_manager.h | 11 ++- ...nager_allocate_in_preferred_pool_tests.cpp | 82 +++++++++++++++---- 4 files changed, 83 insertions(+), 27 deletions(-) diff --git a/runtime/memory_manager/graphics_allocation.h b/runtime/memory_manager/graphics_allocation.h index 038b0a6aee..dc7d5df341 100644 --- a/runtime/memory_manager/graphics_allocation.h +++ b/runtime/memory_manager/graphics_allocation.h @@ -19,7 +19,9 @@ namespace OCLRT { -typedef unsigned int osHandle; +using osHandle = unsigned int; +using DeviceIndex = uint32_t; + namespace Sharing { constexpr auto nonSharedResource = 0u; } @@ -51,6 +53,8 @@ class GraphicsAllocation : public IDNode { uint64_t allocationOffset = 0u; int residencyTaskCount[maxOsContextCount] = {ObjectNotResident, ObjectNotResident, ObjectNotResident, ObjectNotResident}; bool cpuPtrAllocated = false; // flag indicating if cpuPtr is driver-allocated + DeviceIndex deviceIndex = 0; + bool flushL3Required = false; enum class AllocationType { UNKNOWN = 0, diff --git a/runtime/memory_manager/memory_manager.cpp b/runtime/memory_manager/memory_manager.cpp index f1e158c525..9ee5b7894d 100644 --- a/runtime/memory_manager/memory_manager.cpp +++ b/runtime/memory_manager/memory_manager.cpp @@ -362,8 +362,9 @@ void MemoryManager::registerOsContext(OsContext *contextToRegister) { registeredOsContexts[contextToRegister->getContextId()] = contextToRegister; } -bool MemoryManager::getAllocationData(AllocationData &allocationData, bool allocateMemory, const void *hostPtr, size_t size, GraphicsAllocation::AllocationType type) { - UNRECOVERABLE_IF(hostPtr == nullptr && !allocateMemory); +bool MemoryManager::getAllocationData(AllocationData &allocationData, const AllocationFlags &flags, const DeviceIndex deviceIndex, + const void *hostPtr, size_t size, GraphicsAllocation::AllocationType type) { + UNRECOVERABLE_IF(hostPtr == nullptr && !flags.flags.allocateMemory); bool allow64KbPages = false; bool allow32Bit = false; @@ -411,11 +412,12 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, bool alloc } allocationData.flags.mustBeZeroCopy = mustBeZeroCopy; - allocationData.flags.allocateMemory = allocateMemory; + allocationData.flags.allocateMemory = flags.flags.allocateMemory; allocationData.flags.allow32Bit = allow32Bit; allocationData.flags.allow64kbPages = allow64KbPages; allocationData.flags.forcePin = forcePin; allocationData.flags.uncacheable = uncacheable; + allocationData.flags.flushL3 = flags.flags.flushL3RequiredForRead | flags.flags.flushL3RequiredForWrite; if (allocationData.flags.mustBeZeroCopy) { allocationData.flags.useSystemMemory = true; @@ -424,6 +426,7 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, bool alloc allocationData.hostPtr = hostPtr; allocationData.size = size; allocationData.type = type; + allocationData.deviceIndex = deviceIndex; if (allocationData.flags.allocateMemory) { allocationData.hostPtr = nullptr; @@ -435,7 +438,7 @@ GraphicsAllocation *MemoryManager::allocateGraphicsMemoryInPreferredPool(Allocat AllocationData allocationData; AllocationStatus status = AllocationStatus::Error; - getAllocationData(allocationData, flags.flags.allocateMemory, hostPtr, size, type); + getAllocationData(allocationData, flags, deviceIndex, hostPtr, size, type); UNRECOVERABLE_IF(allocationData.type == GraphicsAllocation::AllocationType::IMAGE || allocationData.type == GraphicsAllocation::AllocationType::SHARED_RESOURCE); GraphicsAllocation *allocation = nullptr; diff --git a/runtime/memory_manager/memory_manager.h b/runtime/memory_manager/memory_manager.h index 64325a6cc8..d491776dbd 100644 --- a/runtime/memory_manager/memory_manager.h +++ b/runtime/memory_manager/memory_manager.h @@ -73,8 +73,6 @@ struct AllocationFlags { } }; -using DeviceIndex = uint32_t; - struct AllocationData { union { struct { @@ -85,7 +83,8 @@ struct AllocationData { uint32_t useSystemMemory : 1; uint32_t forcePin : 1; uint32_t uncacheable : 1; - uint32_t reserved : 25; + uint32_t flushL3 : 1; + uint32_t reserved : 24; } flags; uint32_t allFlags = 0; }; @@ -94,6 +93,7 @@ struct AllocationData { GraphicsAllocation::AllocationType type = GraphicsAllocation::AllocationType::UNKNOWN; const void *hostPtr = nullptr; size_t size = 0; + DeviceIndex deviceIndex = 0; }; struct AlignedMallocRestrictions { @@ -169,6 +169,8 @@ class MemoryManager { if (!allocationData.flags.useSystemMemory && !(allocationData.flags.allow32Bit && this->force32bitAllocations)) { auto allocation = allocateGraphicsMemory(allocationData); if (allocation) { + allocation->deviceIndex = allocationData.deviceIndex; + allocation->flushL3Required = allocationData.flags.flushL3; status = AllocationStatus::Success; } return allocation; @@ -266,7 +268,8 @@ class MemoryManager { size_t getOsContextCount() { return registeredOsContexts.size(); } protected: - static bool getAllocationData(AllocationData &allocationData, bool allocateMemory, const void *hostPtr, size_t size, GraphicsAllocation::AllocationType type); + static bool getAllocationData(AllocationData &allocationData, const AllocationFlags &flags, const DeviceIndex deviceIndex, + const void *hostPtr, size_t size, GraphicsAllocation::AllocationType type); GraphicsAllocation *allocateGraphicsMemory(const AllocationData &allocationData); std::recursive_mutex mtx; diff --git a/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp b/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp index 8974bb2d78..88e76a7b79 100644 --- a/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp @@ -20,8 +20,8 @@ class MemoryManagerGetAlloctionDataTest : public testing::TestWithParam