diff --git a/runtime/memory_manager/graphics_allocation.h b/runtime/memory_manager/graphics_allocation.h index cc3a369066..ed5b81eb91 100644 --- a/runtime/memory_manager/graphics_allocation.h +++ b/runtime/memory_manager/graphics_allocation.h @@ -74,6 +74,7 @@ class GraphicsAllocation : public IDNode { SVM_ZERO_COPY, TAG_BUFFER, TIMESTAMP_PACKET_TAG_BUFFER, + WRITE_COMBINED }; virtual ~GraphicsAllocation(); diff --git a/runtime/memory_manager/memory_manager.cpp b/runtime/memory_manager/memory_manager.cpp index 86c129f4e6..c5e5ee2e29 100644 --- a/runtime/memory_manager/memory_manager.cpp +++ b/runtime/memory_manager/memory_manager.cpp @@ -224,6 +224,7 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo case GraphicsAllocation::AllocationType::PRINTF_SURFACE: case GraphicsAllocation::AllocationType::PRIVATE_SURFACE: case GraphicsAllocation::AllocationType::SCRATCH_SURFACE: + case GraphicsAllocation::AllocationType::WRITE_COMBINED: allow64KbPages = true; allow32Bit = true; default: @@ -242,6 +243,7 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo case GraphicsAllocation::AllocationType::BUFFER: case GraphicsAllocation::AllocationType::BUFFER_COMPRESSED: case GraphicsAllocation::AllocationType::BUFFER_HOST_MEMORY: + case GraphicsAllocation::AllocationType::WRITE_COMBINED: forcePin = true; default: break; @@ -261,6 +263,7 @@ bool MemoryManager::getAllocationData(AllocationData &allocationData, const Allo case GraphicsAllocation::AllocationType::SVM_CPU: case GraphicsAllocation::AllocationType::SVM_GPU: case GraphicsAllocation::AllocationType::SVM_ZERO_COPY: + case GraphicsAllocation::AllocationType::WRITE_COMBINED: mayRequireL3Flush = true; default: break; diff --git a/runtime/os_interface/debug_settings_manager.cpp b/runtime/os_interface/debug_settings_manager.cpp index 3dab029993..59eeaf7b9e 100644 --- a/runtime/os_interface/debug_settings_manager.cpp +++ b/runtime/os_interface/debug_settings_manager.cpp @@ -375,7 +375,8 @@ const char *DebugSettingsManager::getAllocationTypeString(GraphicsAl return "TIMESTAMP_PACKET_TAG_BUFFER"; case GraphicsAllocation::AllocationType::UNKNOWN: return "UNKNOWN"; - + case GraphicsAllocation::AllocationType::WRITE_COMBINED: + return "WRITE_COMBINED"; default: return "ILLEGAL_VALUE"; } diff --git a/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.inl b/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.inl index 0dd2f0c6a3..51911ee73b 100644 --- a/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.inl +++ b/unit_tests/memory_manager/memory_manager_allocate_in_preferred_pool_tests.inl @@ -86,6 +86,16 @@ TEST(MemoryManagerGetAlloctionDataTest, givenBufferCompressedTypeWhenAllocationD EXPECT_TRUE(allocData.flags.forcePin); } +TEST(MemoryManagerGetAlloctionDataTest, givenWriteCombinedTypeWhenAllocationDataIsQueriedThenForcePinFlagIsSet) { + AllocationData allocData; + AllocationProperties properties(true, 10, GraphicsAllocation::AllocationType::WRITE_COMBINED, false); + + MockMemoryManager mockMemoryManager; + MockMemoryManager::getAllocationData(allocData, properties, nullptr, mockMemoryManager.createStorageInfoFromProperties(properties)); + + EXPECT_TRUE(allocData.flags.forcePin); +} + TEST(MemoryManagerGetAlloctionDataTest, givenDefaultAllocationFlagsWhenAllocationDataIsQueriedThenAllocateMemoryIsFalse) { AllocationData allocData; AllocationProperties properties(false, 0, GraphicsAllocation::AllocationType::BUFFER_COMPRESSED, false); @@ -151,7 +161,8 @@ static const GraphicsAllocation::AllocationType allocationTypesWith32BitAnd64KbP GraphicsAllocation::AllocationType::PRIVATE_SURFACE, GraphicsAllocation::AllocationType::PRINTF_SURFACE, GraphicsAllocation::AllocationType::CONSTANT_SURFACE, - GraphicsAllocation::AllocationType::GLOBAL_SURFACE}; + GraphicsAllocation::AllocationType::GLOBAL_SURFACE, + GraphicsAllocation::AllocationType::WRITE_COMBINED}; INSTANTIATE_TEST_CASE_P(Allow32BitAnd64kbPagesTypes, MemoryManagerGetAlloctionData32BitAnd64kbPagesAllowedTest, @@ -417,6 +428,14 @@ TEST(MemoryManagerTest, givenGlobalSurfaceTypeWhenGetAllocationDataIsCalledThenS EXPECT_FALSE(allocData.flags.useSystemMemory); } +TEST(MemoryManagerTest, givenWriteCombinedTypeWhenGetAllocationDataIsCalledThenSystemMemoryIsNotRequested) { + AllocationData allocData; + MockMemoryManager mockMemoryManager; + AllocationProperties properties{1, GraphicsAllocation::AllocationType::WRITE_COMBINED}; + MockMemoryManager::getAllocationData(allocData, properties, nullptr, mockMemoryManager.createStorageInfoFromProperties(properties)); + EXPECT_FALSE(allocData.flags.useSystemMemory); +} + TEST(MemoryManagerTest, givenDeviceQueueBufferTypeWhenGetAllocationDataIsCalledThenSystemMemoryIsRequested) { AllocationData allocData; MockMemoryManager mockMemoryManager; diff --git a/unit_tests/memory_manager/memory_manager_tests.cpp b/unit_tests/memory_manager/memory_manager_tests.cpp index 9c5b7d5dd4..bca852dc06 100644 --- a/unit_tests/memory_manager/memory_manager_tests.cpp +++ b/unit_tests/memory_manager/memory_manager_tests.cpp @@ -1681,7 +1681,7 @@ TEST(MemoryManagerTest, givenAllocationTypesThatMayNeedL3FlushWhenCallingGetAllo GraphicsAllocation::AllocationType::PIPE, GraphicsAllocation::AllocationType::SHARED_IMAGE, GraphicsAllocation::AllocationType::SHARED_BUFFER, GraphicsAllocation::AllocationType::SHARED_RESOURCE_COPY, GraphicsAllocation::AllocationType::SVM_ZERO_COPY, GraphicsAllocation::AllocationType::SVM_GPU, - GraphicsAllocation::AllocationType::SVM_CPU}; + GraphicsAllocation::AllocationType::SVM_CPU, GraphicsAllocation::AllocationType::WRITE_COMBINED}; MockMemoryManager mockMemoryManager; for (auto allocationType : allocationTypesThatMayNeedL3Flush) { diff --git a/unit_tests/os_interface/debug_settings_manager_tests.cpp b/unit_tests/os_interface/debug_settings_manager_tests.cpp index 63cb3ba455..c6954b2ba5 100644 --- a/unit_tests/os_interface/debug_settings_manager_tests.cpp +++ b/unit_tests/os_interface/debug_settings_manager_tests.cpp @@ -933,7 +933,8 @@ AllocationTypeTestCase allocationTypeValues[] = { {GraphicsAllocation::AllocationType::SVM_ZERO_COPY, "SVM_ZERO_COPY"}, {GraphicsAllocation::AllocationType::TAG_BUFFER, "TAG_BUFFER"}, {GraphicsAllocation::AllocationType::TIMESTAMP_PACKET_TAG_BUFFER, "TIMESTAMP_PACKET_TAG_BUFFER"}, - {GraphicsAllocation::AllocationType::UNKNOWN, "UNKNOWN"}}; + {GraphicsAllocation::AllocationType::UNKNOWN, "UNKNOWN"}, + {GraphicsAllocation::AllocationType::WRITE_COMBINED, "WRITE_COMBINED"}}; class AllocationTypeLogging : public ::testing::TestWithParam {}; diff --git a/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp b/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp index e060c5b2e5..4d06e90ac8 100644 --- a/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp +++ b/unit_tests/os_interface/windows/wddm_memory_manager_tests.cpp @@ -1692,6 +1692,25 @@ TEST_F(WddmMemoryManagerSimpleTest, givenSvmCpuAllocationWhenSizeAndAlignmentPro memoryManager->freeGraphicsMemory(allocation); } +TEST_F(WddmMemoryManagerSimpleTest, givenWriteCombinedAllocationThenCpuAddressIsEqualToGpuAddress) { + if (is32bit) { + GTEST_SKIP(); + } + memoryManager.reset(new MockWddmMemoryManager(true, true, *executionEnvironment)); + size_t size = 2 * MemoryConstants::megaByte; + auto allocation = static_cast(memoryManager->allocateGraphicsMemoryWithProperties({size, GraphicsAllocation::AllocationType::WRITE_COMBINED})); + ASSERT_NE(nullptr, allocation); + EXPECT_EQ(size, allocation->getUnderlyingBufferSize()); + EXPECT_NE(nullptr, allocation->getUnderlyingBuffer()); + EXPECT_NE(nullptr, reinterpret_cast(allocation->getGpuAddress())); + + if (executionEnvironment->isFullRangeSvm()) { + EXPECT_EQ(allocation->getUnderlyingBuffer(), reinterpret_cast(allocation->getGpuAddress())); + } + + memoryManager->freeGraphicsMemory(allocation); +} + TEST_F(WddmMemoryManagerSimpleTest, whenCreatingWddmMemoryManagerThenSupportsMultiStorageResourcesFlagIsSetToFalse) { EXPECT_TRUE(memoryManager->supportsMultiStorageResources); }