@@ -131,7 +131,16 @@ class DrmMemoryManagerLocalMemoryTest : public ::testing::Test {
131131 memoryManager = std::make_unique<TestedDrmMemoryManager>(localMemoryEnabled, false , false , *executionEnvironment);
132132 }
133133
134+ bool isAllocationWithinHeap (const GraphicsAllocation &allocation, HeapIndex heap) {
135+ const auto allocationStart = allocation.getGpuAddress ();
136+ const auto allocationEnd = allocationStart + allocation.getUnderlyingBufferSize ();
137+ const auto heapStart = GmmHelper::canonize (memoryManager->getGfxPartition (rootDeviceIndex)->getHeapBase (heap));
138+ const auto heapEnd = GmmHelper::canonize (memoryManager->getGfxPartition (rootDeviceIndex)->getHeapLimit (heap));
139+ return heapStart <= allocationStart && allocationEnd <= heapEnd;
140+ }
141+
134142 protected:
143+ DebugManagerStateRestore restorer{};
135144 ExecutionEnvironment *executionEnvironment = nullptr ;
136145 std::unique_ptr<MockDevice> device;
137146 std::unique_ptr<TestedDrmMemoryManager> memoryManager;
@@ -882,8 +891,13 @@ TEST_F(DrmMemoryManagerLocalMemoryTest, givenSupportedTypeWhenAllocatingInDevice
882891 EXPECT_LT (GmmHelper::canonize (memoryManager->getGfxPartition (0 )->getHeapBase (HeapIndex::HEAP_INTERNAL_DEVICE_MEMORY)), gpuAddress);
883892 EXPECT_GT (GmmHelper::canonize (memoryManager->getGfxPartition (0 )->getHeapLimit (HeapIndex::HEAP_INTERNAL_DEVICE_MEMORY)), gpuAddress);
884893 } else {
894+ const bool prefer2MBAlignment = allocation->getUnderlyingBufferSize () >= 2 * MemoryConstants::megaByte;
895+ const bool prefer57bitAddressing = memoryManager->getGfxPartition (0 )->getHeapLimit (HeapIndex::HEAP_EXTENDED) > 0 && !allocData.flags .resource48Bit ;
896+
885897 auto heap = HeapIndex::HEAP_STANDARD64KB;
886- if (memoryManager->getGfxPartition (0 )->getHeapLimit (HeapIndex::HEAP_EXTENDED) && !allocData.flags .resource48Bit ) {
898+ if (prefer2MBAlignment) {
899+ heap = HeapIndex::HEAP_STANDARD2MB;
900+ } else if (prefer57bitAddressing) {
887901 heap = HeapIndex::HEAP_EXTENDED;
888902 }
889903
@@ -899,6 +913,118 @@ TEST_F(DrmMemoryManagerLocalMemoryTest, givenSupportedTypeWhenAllocatingInDevice
899913 }
900914}
901915
916+ TEST_F (DrmMemoryManagerLocalMemoryTest, given2MbAlignmentAllowedWhenAllocatingAllocationLessThen2MbThenUse64kbHeap) {
917+ AllocationData allocationData;
918+ allocationData.allFlags = 0 ;
919+ allocationData.size = MemoryConstants::pageSize;
920+ allocationData.flags .allocateMemory = true ;
921+ allocationData.rootDeviceIndex = rootDeviceIndex;
922+ allocationData.type = GraphicsAllocation::AllocationType::BUFFER;
923+ allocationData.flags .resource48Bit = true ;
924+ MemoryManager::AllocationStatus allocationStatus;
925+
926+ {
927+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (-1 );
928+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
929+ ASSERT_NE (nullptr , allocation);
930+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
931+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD64KB));
932+ memoryManager->freeGraphicsMemory (allocation);
933+ }
934+ {
935+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (0 );
936+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
937+ ASSERT_NE (nullptr , allocation);
938+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
939+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD64KB));
940+ memoryManager->freeGraphicsMemory (allocation);
941+ }
942+ {
943+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (1 );
944+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
945+ ASSERT_NE (nullptr , allocation);
946+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
947+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD64KB));
948+ memoryManager->freeGraphicsMemory (allocation);
949+ }
950+ }
951+
952+ TEST_F (DrmMemoryManagerLocalMemoryTest, given2MbAlignmentAllowedWhenAllocatingAllocationBiggerThan2MbThenUse2MbHeap) {
953+ AllocationData allocationData;
954+ allocationData.allFlags = 0 ;
955+ allocationData.size = 2 * MemoryConstants::megaByte;
956+ allocationData.flags .allocateMemory = true ;
957+ allocationData.rootDeviceIndex = rootDeviceIndex;
958+ allocationData.type = GraphicsAllocation::AllocationType::BUFFER;
959+ allocationData.flags .resource48Bit = true ;
960+ MemoryManager::AllocationStatus allocationStatus;
961+
962+ {
963+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (-1 );
964+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
965+ ASSERT_NE (nullptr , allocation);
966+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
967+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD2MB));
968+ memoryManager->freeGraphicsMemory (allocation);
969+ }
970+ {
971+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (0 );
972+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
973+ ASSERT_NE (nullptr , allocation);
974+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
975+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD64KB));
976+ memoryManager->freeGraphicsMemory (allocation);
977+ }
978+ {
979+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (1 );
980+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
981+ ASSERT_NE (nullptr , allocation);
982+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
983+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD2MB));
984+ memoryManager->freeGraphicsMemory (allocation);
985+ }
986+ }
987+
988+ TEST_F (DrmMemoryManagerLocalMemoryTest, givenExtendedHeapPreferredAnd2MbAlignmentAllowedWhenAllocatingAllocationBiggerThenPrefer2MbHeap) {
989+ if (memoryManager->getGfxPartition (0 )->getHeapLimit (HeapIndex::HEAP_EXTENDED) == 0 ) {
990+ GTEST_SKIP ();
991+ }
992+
993+ AllocationData allocationData;
994+ allocationData.allFlags = 0 ;
995+ allocationData.size = 2 * MemoryConstants::megaByte;
996+ allocationData.flags .allocateMemory = true ;
997+ allocationData.rootDeviceIndex = rootDeviceIndex;
998+ allocationData.type = GraphicsAllocation::AllocationType::BUFFER;
999+ allocationData.flags .resource48Bit = false ;
1000+ MemoryManager::AllocationStatus allocationStatus;
1001+
1002+ {
1003+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (-1 );
1004+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
1005+ ASSERT_NE (nullptr , allocation);
1006+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
1007+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD2MB));
1008+ memoryManager->freeGraphicsMemory (allocation);
1009+ }
1010+ {
1011+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (0 );
1012+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
1013+ ASSERT_NE (nullptr , allocation);
1014+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
1015+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_EXTENDED));
1016+ memoryManager->freeGraphicsMemory (allocation);
1017+ }
1018+ {
1019+ DebugManager.flags .AlignLocalMemoryVaTo2MB .set (1 );
1020+ auto allocation = memoryManager->allocateGraphicsMemoryInDevicePool (allocationData, allocationStatus);
1021+ ASSERT_NE (nullptr , allocation);
1022+ EXPECT_EQ (MemoryManager::AllocationStatus::Success, allocationStatus);
1023+ EXPECT_TRUE (isAllocationWithinHeap (*allocation, HeapIndex::HEAP_STANDARD2MB));
1024+ memoryManager->freeGraphicsMemory (allocation);
1025+ }
1026+ }
1027+
9021028TEST_F (DrmMemoryManagerLocalMemoryTest, givenUnsupportedTypeWhenAllocatingInDevicePoolThenRetryInNonDevicePoolStatusAndNullptrIsReturned) {
9031029 MemoryManager::AllocationStatus status = MemoryManager::AllocationStatus::Success;
9041030 AllocationData allocData;
0 commit comments