diff --git a/shared/source/os_interface/windows/wddm_memory_manager.cpp b/shared/source/os_interface/windows/wddm_memory_manager.cpp index 2cb72e9692..fc0becbc03 100644 --- a/shared/source/os_interface/windows/wddm_memory_manager.cpp +++ b/shared/source/os_interface/windows/wddm_memory_manager.cpp @@ -138,7 +138,9 @@ GraphicsAllocation *WddmMemoryManager::allocateMemoryByKMD(const AllocationData allocationData.type, nullptr, 0, allocationData.size, nullptr, MemoryPool::SystemCpuInaccessible, allocationData.flags.shareable, maxOsContextCount); allocation->setDefaultGmm(gmm.get()); - if (!createWddmAllocation(allocation.get(), nullptr)) { + void *requiredGpuVa = nullptr; + adjustGpuPtrToHostAddressSpace(*allocation.get(), requiredGpuVa); + if (!createWddmAllocation(allocation.get(), requiredGpuVa)) { return nullptr; } @@ -1408,7 +1410,8 @@ bool WddmMemoryManager::isStatelessAccessRequired(AllocationType type) { type == AllocationType::SHARED_BUFFER || type == AllocationType::SCRATCH_SURFACE || type == AllocationType::LINEAR_STREAM || - type == AllocationType::PRIVATE_SURFACE) { + type == AllocationType::PRIVATE_SURFACE || + type == AllocationType::CONSTANT_SURFACE) { return true; } return false; 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 fe7e118760..c5e2dbd812 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 @@ -183,6 +183,7 @@ class MockAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWddm : public MemoryManag public: using WddmMemoryManager::adjustGpuPtrToHostAddressSpace; using WddmMemoryManager::allocateGraphicsMemoryUsingKmdAndMapItToCpuVA; + using WddmMemoryManager::allocateMemoryByKMD; using WddmMemoryManager::mapGpuVirtualAddress; MockAllocateGraphicsMemoryUsingKmdAndMapItToCpuVAWddm(ExecutionEnvironment &executionEnvironment) : MemoryManagerCreate(false, false, executionEnvironment) {} @@ -373,6 +374,21 @@ TEST_F(WddmMemoryManagerAllocPathTests, givenAllocateGraphicsMemoryUsingKmdAndMa memoryManager->freeGraphicsMemory(graphicsAllocation); } +TEST_F(WddmMemoryManagerAllocPathTests, givenAllocateMemoryByKMDWhen32bitAndIsStatelessAccessRequiredThenProperAddressSet) { + if constexpr (is64bit) { + GTEST_SKIP(); + } + NEO::AllocationData allocData = {}; + allocData.type = NEO::AllocationType::CONSTANT_SURFACE; + + auto graphicsAllocation = memoryManager->allocateMemoryByKMD(allocData); + + EXPECT_NE(nullptr, graphicsAllocation); + EXPECT_LT(graphicsAllocation->getGpuAddress(), MemoryConstants::max32BitAddress); + + memoryManager->freeGraphicsMemory(graphicsAllocation); +} + class MockWddmReserveValidAddressRange : public WddmMock { public: MockWddmReserveValidAddressRange(RootDeviceEnvironment &rootDeviceEnvironment) : WddmMock(rootDeviceEnvironment){}; @@ -443,12 +459,12 @@ TEST_F(WddmMemoryManagerTests, givenTypeWhenCallIsStatelessAccessRequiredThenPro AllocationType::SHARED_BUFFER, AllocationType::SCRATCH_SURFACE, AllocationType::LINEAR_STREAM, - AllocationType::PRIVATE_SURFACE}) { + AllocationType::PRIVATE_SURFACE, + AllocationType::CONSTANT_SURFACE}) { EXPECT_TRUE(wddmMemoryManager->isStatelessAccessRequired(type)); } for (auto type : {AllocationType::BUFFER_HOST_MEMORY, AllocationType::COMMAND_BUFFER, - AllocationType::CONSTANT_SURFACE, AllocationType::EXTERNAL_HOST_PTR, AllocationType::FILL_PATTERN, AllocationType::GLOBAL_SURFACE,