diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 075aa531ca..eca8db841b 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -206,7 +206,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryForImageImpl(const GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemory64kb(const AllocationData &allocationData) { AllocationData allocationData64KbAlignment = allocationData; - allocationData64KbAlignment.alignment = MemoryConstants::pageSize64k; + allocationData64KbAlignment.alignment = MemoryConstants::pageSize64k > allocationData64KbAlignment.alignment ? MemoryConstants::pageSize64k : allocationData64KbAlignment.alignment; return allocateGraphicsMemoryUsingKmdAndMapItToCpuVA(allocationData64KbAlignment, true); } @@ -252,7 +252,7 @@ GraphicsAllocation *WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToC } auto gmm = new Gmm(executionEnvironment.rootDeviceEnvironments[allocationData.rootDeviceIndex]->getGmmHelper(), nullptr, - sizeAligned, 0u, + sizeAligned, allocationData.alignment, CacheSettingsHelper::getGmmUsageType(wddmAllocation->getAllocationType(), !!allocationData.flags.uncacheable, productHelper, hwInfo), storageInfo, gmmRequirements); diff --git a/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp b/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp index 5e1801bccd..c19c6762ca 100644 --- a/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp +++ b/shared/test/unit_test/memory_manager/memory_manager_allocate_in_preferred_pool_tests.cpp @@ -385,6 +385,38 @@ TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWithoutAllow64kbP memoryManager.freeGraphicsMemory(allocation); } +TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWith128kbAlignmentCreatedThen64kbAllocationIsReturned) { + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); + MockMemoryManager memoryManager(true, false, executionEnvironment); + AllocationData allocData; + AllocationProperties properties(mockRootDeviceIndex, 10, AllocationType::buffer, mockDeviceBitfield); + + memoryManager.getAllocationData(allocData, properties, nullptr, memoryManager.createStorageInfoFromProperties(properties)); + allocData.flags.allow64kbPages = true; + allocData.alignment = 2 * MemoryConstants::pageSize64k; + + auto allocation = memoryManager.allocateGraphicsMemory(allocData); + EXPECT_TRUE(memoryManager.allocation64kbPageCreated); + + memoryManager.freeGraphicsMemory(allocation); +} + +TEST(MemoryManagerTest, givenEnabled64kbPagesWhenGraphicsMemoryWith32kbAlignmentCreatedThen64kbAllocationIsReturned) { + MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); + MockMemoryManager memoryManager(true, false, executionEnvironment); + AllocationData allocData; + AllocationProperties properties(mockRootDeviceIndex, 10, AllocationType::buffer, mockDeviceBitfield); + + memoryManager.getAllocationData(allocData, properties, nullptr, memoryManager.createStorageInfoFromProperties(properties)); + allocData.flags.allow64kbPages = true; + allocData.alignment = MemoryConstants::pageSize64k / 2; + + auto allocation = memoryManager.allocateGraphicsMemory(allocData); + EXPECT_TRUE(memoryManager.allocation64kbPageCreated); + + memoryManager.freeGraphicsMemory(allocation); +} + TEST(MemoryManagerTest, givenDisabled64kbPagesWhenGraphicsMemoryMustBeHostMemoryAndIsAllocatedWithNullptrForBufferThenNon64kbAllocationIsReturned) { MockExecutionEnvironment executionEnvironment(defaultHwInfo.get()); MockMemoryManager memoryManager(false, false, executionEnvironment); diff --git a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp index 4e912e8bba..e2a64008f0 100644 --- a/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/shared/test/unit_test/os_interface/windows/wddm_memory_manager_tests.cpp @@ -264,6 +264,16 @@ TEST_F(WddmMemoryManagerTests, givenAllocateGraphicsMemory64kbWhen32bitThenAddre memoryManager.freeGraphicsMemory(allocation); } +TEST_F(WddmMemoryManagerTests, givenMemoryManagerWith64KBPagesEnabledWhenAllocateGraphicsMemoryWith128kbAlignmentThenGmmObjectHasCorrectAlignment) { + MockWddmMemoryManager memoryManager(false, false, *executionEnvironment); + AllocationData allocationData; + allocationData.size = 4096u; + allocationData.alignment = 2 * MemoryConstants::pageSize64k; + auto allocation = memoryManager.allocateGraphicsMemory64kb(allocationData); + + EXPECT_EQ(allocation->getDefaultGmm()->resourceParams.BaseAlignment, allocationData.alignment); + memoryManager.freeGraphicsMemory(allocation); +} class MockAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWddm : public MemoryManagerCreate { public: using WddmMemoryManager::adjustGpuPtrToHostAddressSpace;