diff options
| author | 2023-12-30 08:20:29 +0100 | |
|---|---|---|
| committer | 2024-01-18 21:12:30 -0500 | |
| commit | 9b11b9dce58b144d7f4407677a5e2dd52ca1888c (patch) | |
| tree | 3ad809761f93833fa8ad350a6ef6273001df287c | |
| parent | SMMU: Add Android compatibility (diff) | |
| download | yuzu-9b11b9dce58b144d7f4407677a5e2dd52ca1888c.tar.gz yuzu-9b11b9dce58b144d7f4407677a5e2dd52ca1888c.tar.xz yuzu-9b11b9dce58b144d7f4407677a5e2dd52ca1888c.zip | |
SMMU: Simplify and remove old code.
| -rw-r--r-- | src/core/device_memory_manager.h | 14 | ||||
| -rw-r--r-- | src/core/device_memory_manager.inc | 69 | ||||
| -rw-r--r-- | src/video_core/host1x/gpu_device_memory_manager.h | 1 |
3 files changed, 13 insertions, 71 deletions
diff --git a/src/core/device_memory_manager.h b/src/core/device_memory_manager.h index 7c7726348..0273b78db 100644 --- a/src/core/device_memory_manager.h +++ b/src/core/device_memory_manager.h | |||
| @@ -38,7 +38,6 @@ public: | |||
| 38 | 38 | ||
| 39 | DAddr Allocate(size_t size); | 39 | DAddr Allocate(size_t size); |
| 40 | void AllocateFixed(DAddr start, size_t size); | 40 | void AllocateFixed(DAddr start, size_t size); |
| 41 | DAddr AllocatePinned(size_t size); | ||
| 42 | void Free(DAddr start, size_t size); | 41 | void Free(DAddr start, size_t size); |
| 43 | 42 | ||
| 44 | void Map(DAddr address, VAddr virtual_address, size_t size, size_t process_id); | 43 | void Map(DAddr address, VAddr virtual_address, size_t size, size_t process_id); |
| @@ -108,7 +107,6 @@ public: | |||
| 108 | static constexpr size_t AS_BITS = Traits::device_virtual_bits; | 107 | static constexpr size_t AS_BITS = Traits::device_virtual_bits; |
| 109 | 108 | ||
| 110 | private: | 109 | private: |
| 111 | static constexpr bool supports_pinning = Traits::supports_pinning; | ||
| 112 | static constexpr size_t device_virtual_bits = Traits::device_virtual_bits; | 110 | static constexpr size_t device_virtual_bits = Traits::device_virtual_bits; |
| 113 | static constexpr size_t device_as_size = 1ULL << device_virtual_bits; | 111 | static constexpr size_t device_as_size = 1ULL << device_virtual_bits; |
| 114 | static constexpr size_t physical_max_bits = 33; | 112 | static constexpr size_t physical_max_bits = 33; |
| @@ -167,28 +165,28 @@ private: | |||
| 167 | } | 165 | } |
| 168 | 166 | ||
| 169 | void InsertCPUBacking(size_t page_index, VAddr address, size_t process_id) { | 167 | void InsertCPUBacking(size_t page_index, VAddr address, size_t process_id) { |
| 170 | cpu_backing_address[page_index] = address | (process_id << page_index); | 168 | cpu_backing_address[page_index] = address | (process_id << process_id_start_bit); |
| 171 | } | 169 | } |
| 172 | 170 | ||
| 173 | Common::VirtualBuffer<VAddr> cpu_backing_address; | 171 | Common::VirtualBuffer<VAddr> cpu_backing_address; |
| 174 | static constexpr size_t subentries = 4; | 172 | static constexpr size_t subentries = 8 / sizeof(u8); |
| 175 | static constexpr size_t subentries_mask = subentries - 1; | 173 | static constexpr size_t subentries_mask = subentries - 1; |
| 176 | class CounterEntry final { | 174 | class CounterEntry final { |
| 177 | public: | 175 | public: |
| 178 | CounterEntry() = default; | 176 | CounterEntry() = default; |
| 179 | 177 | ||
| 180 | std::atomic_uint16_t& Count(std::size_t page) { | 178 | std::atomic_uint8_t& Count(std::size_t page) { |
| 181 | return values[page & subentries_mask]; | 179 | return values[page & subentries_mask]; |
| 182 | } | 180 | } |
| 183 | 181 | ||
| 184 | const std::atomic_uint16_t& Count(std::size_t page) const { | 182 | const std::atomic_uint8_t& Count(std::size_t page) const { |
| 185 | return values[page & subentries_mask]; | 183 | return values[page & subentries_mask]; |
| 186 | } | 184 | } |
| 187 | 185 | ||
| 188 | private: | 186 | private: |
| 189 | std::array<std::atomic_uint16_t, subentries> values{}; | 187 | std::array<std::atomic_uint8_t, subentries> values{}; |
| 190 | }; | 188 | }; |
| 191 | static_assert(sizeof(CounterEntry) == subentries * sizeof(u16), | 189 | static_assert(sizeof(CounterEntry) == subentries * sizeof(u8), |
| 192 | "CounterEntry should be 8 bytes!"); | 190 | "CounterEntry should be 8 bytes!"); |
| 193 | 191 | ||
| 194 | static constexpr size_t num_counter_entries = | 192 | static constexpr size_t num_counter_entries = |
diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 4f883cece..e9d0efe19 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc | |||
| @@ -131,81 +131,31 @@ struct EmptyAllocator { | |||
| 131 | 131 | ||
| 132 | template <typename DTraits> | 132 | template <typename DTraits> |
| 133 | struct DeviceMemoryManagerAllocator { | 133 | struct DeviceMemoryManagerAllocator { |
| 134 | static constexpr bool supports_pinning = DTraits::supports_pinning; | ||
| 135 | static constexpr size_t device_virtual_bits = DTraits::device_virtual_bits; | 134 | static constexpr size_t device_virtual_bits = DTraits::device_virtual_bits; |
| 136 | static constexpr size_t pin_bits = 32; | ||
| 137 | static constexpr DAddr first_address = 1ULL << Memory::YUZU_PAGEBITS; | 135 | static constexpr DAddr first_address = 1ULL << Memory::YUZU_PAGEBITS; |
| 138 | static constexpr DAddr max_pin_area = supports_pinning ? 1ULL << pin_bits : first_address; | ||
| 139 | static constexpr DAddr max_device_area = 1ULL << device_virtual_bits; | 136 | static constexpr DAddr max_device_area = 1ULL << device_virtual_bits; |
| 140 | 137 | ||
| 141 | DeviceMemoryManagerAllocator() | 138 | DeviceMemoryManagerAllocator() : main_allocator(first_address) {} |
| 142 | : pin_allocator(first_address), | ||
| 143 | main_allocator(supports_pinning ? 1ULL << pin_bits : first_address) {} | ||
| 144 | 139 | ||
| 145 | std::conditional_t<supports_pinning, Common::FlatAllocator<DAddr, 0, pin_bits>, EmptyAllocator> | ||
| 146 | pin_allocator; | ||
| 147 | Common::FlatAllocator<DAddr, 0, device_virtual_bits> main_allocator; | 140 | Common::FlatAllocator<DAddr, 0, device_virtual_bits> main_allocator; |
| 148 | MultiAddressContainer multi_dev_address; | 141 | MultiAddressContainer multi_dev_address; |
| 149 | 142 | ||
| 150 | /// Returns true when vaddr -> vaddr+size is fully contained in the buffer | 143 | /// Returns true when vaddr -> vaddr+size is fully contained in the buffer |
| 151 | template <bool pin_area> | 144 | template <bool pin_area> |
| 152 | [[nodiscard]] bool IsInBounds(VAddr addr, u64 size) const noexcept { | 145 | [[nodiscard]] bool IsInBounds(VAddr addr, u64 size) const noexcept { |
| 153 | if constexpr (pin_area) { | 146 | return addr >= 0 && addr + size <= max_device_area; |
| 154 | return addr >= 0 && addr + size <= max_pin_area; | ||
| 155 | } else { | ||
| 156 | return addr >= max_pin_area && addr + size <= max_device_area; | ||
| 157 | } | ||
| 158 | } | 147 | } |
| 159 | 148 | ||
| 160 | DAddr Allocate(size_t size) { | 149 | DAddr Allocate(size_t size) { |
| 161 | return main_allocator.Allocate(size); | 150 | return main_allocator.Allocate(size); |
| 162 | } | 151 | } |
| 163 | 152 | ||
| 164 | DAddr AllocatePinned(size_t size) { | ||
| 165 | if constexpr (supports_pinning) { | ||
| 166 | return pin_allocator.Allocate(size); | ||
| 167 | } else { | ||
| 168 | return DAddr{}; | ||
| 169 | } | ||
| 170 | } | ||
| 171 | |||
| 172 | void DoInRange(DAddr address, size_t size, auto pin_func, auto main_func) { | ||
| 173 | if (IsInBounds<true>(address, size)) { | ||
| 174 | pin_func(address, size); | ||
| 175 | return; | ||
| 176 | } | ||
| 177 | if (IsInBounds<false>(address, size)) { | ||
| 178 | main_func(address, size); | ||
| 179 | return; | ||
| 180 | } | ||
| 181 | DAddr end_size = address + size - max_pin_area; | ||
| 182 | DAddr end_size2 = max_pin_area - address; | ||
| 183 | pin_func(address, end_size2); | ||
| 184 | main_func(max_pin_area, end_size); | ||
| 185 | } | ||
| 186 | |||
| 187 | void AllocateFixed(DAddr b_address, size_t b_size) { | 153 | void AllocateFixed(DAddr b_address, size_t b_size) { |
| 188 | if constexpr (supports_pinning) { | 154 | main_allocator.AllocateFixed(b_address, b_size); |
| 189 | DoInRange( | ||
| 190 | b_address, b_size, | ||
| 191 | [this](DAddr address, size_t size) { pin_allocator.AllocateFixed(address, size); }, | ||
| 192 | [this](DAddr address, size_t size) { | ||
| 193 | main_allocator.AllocateFixed(address, size); | ||
| 194 | }); | ||
| 195 | } else { | ||
| 196 | main_allocator.AllocateFixed(b_address, b_size); | ||
| 197 | } | ||
| 198 | } | 155 | } |
| 199 | 156 | ||
| 200 | void Free(DAddr b_address, size_t b_size) { | 157 | void Free(DAddr b_address, size_t b_size) { |
| 201 | if constexpr (supports_pinning) { | 158 | main_allocator.Free(b_address, b_size); |
| 202 | DoInRange( | ||
| 203 | b_address, b_size, | ||
| 204 | [this](DAddr address, size_t size) { pin_allocator.Free(address, size); }, | ||
| 205 | [this](DAddr address, size_t size) { main_allocator.Free(address, size); }); | ||
| 206 | } else { | ||
| 207 | main_allocator.Free(b_address, b_size); | ||
| 208 | } | ||
| 209 | } | 159 | } |
| 210 | }; | 160 | }; |
| 211 | 161 | ||
| @@ -238,11 +188,6 @@ void DeviceMemoryManager<Traits>::AllocateFixed(DAddr start, size_t size) { | |||
| 238 | } | 188 | } |
| 239 | 189 | ||
| 240 | template <typename Traits> | 190 | template <typename Traits> |
| 241 | DAddr DeviceMemoryManager<Traits>::AllocatePinned(size_t size) { | ||
| 242 | return impl->AllocatePinned(size); | ||
| 243 | } | ||
| 244 | |||
| 245 | template <typename Traits> | ||
| 246 | void DeviceMemoryManager<Traits>::Free(DAddr start, size_t size) { | 191 | void DeviceMemoryManager<Traits>::Free(DAddr start, size_t size) { |
| 247 | impl->Free(start, size); | 192 | impl->Free(start, size); |
| 248 | } | 193 | } |
| @@ -523,10 +468,10 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size | |||
| 523 | size_t vpage = base_vaddress >> Memory::YUZU_PAGEBITS; | 468 | size_t vpage = base_vaddress >> Memory::YUZU_PAGEBITS; |
| 524 | auto* memory_interface = registered_processes[process_id]; | 469 | auto* memory_interface = registered_processes[process_id]; |
| 525 | for (; page != page_end; ++page) { | 470 | for (; page != page_end; ++page) { |
| 526 | std::atomic_uint16_t& count = cached_pages->at(page >> 2).Count(page); | 471 | std::atomic_uint8_t& count = cached_pages->at(page >> 3).Count(page); |
| 527 | 472 | ||
| 528 | if (delta > 0) { | 473 | if (delta > 0) { |
| 529 | ASSERT_MSG(count.load(std::memory_order::relaxed) < std::numeric_limits<u16>::max(), | 474 | ASSERT_MSG(count.load(std::memory_order::relaxed) < std::numeric_limits<u8>::max(), |
| 530 | "Count may overflow!"); | 475 | "Count may overflow!"); |
| 531 | } else if (delta < 0) { | 476 | } else if (delta < 0) { |
| 532 | ASSERT_MSG(count.load(std::memory_order::relaxed) > 0, "Count may underflow!"); | 477 | ASSERT_MSG(count.load(std::memory_order::relaxed) > 0, "Count may underflow!"); |
| @@ -535,7 +480,7 @@ void DeviceMemoryManager<Traits>::UpdatePagesCachedCount(DAddr addr, size_t size | |||
| 535 | } | 480 | } |
| 536 | 481 | ||
| 537 | // Adds or subtracts 1, as count is a unsigned 8-bit value | 482 | // Adds or subtracts 1, as count is a unsigned 8-bit value |
| 538 | count.fetch_add(static_cast<u16>(delta), std::memory_order_release); | 483 | count.fetch_add(static_cast<u8>(delta), std::memory_order_release); |
| 539 | 484 | ||
| 540 | // Assume delta is either -1 or 1 | 485 | // Assume delta is either -1 or 1 |
| 541 | if (count.load(std::memory_order::relaxed) == 0) { | 486 | if (count.load(std::memory_order::relaxed) == 0) { |
diff --git a/src/video_core/host1x/gpu_device_memory_manager.h b/src/video_core/host1x/gpu_device_memory_manager.h index 9ccd84b9a..a9f249991 100644 --- a/src/video_core/host1x/gpu_device_memory_manager.h +++ b/src/video_core/host1x/gpu_device_memory_manager.h | |||
| @@ -14,7 +14,6 @@ namespace Tegra { | |||
| 14 | struct MaxwellDeviceMethods; | 14 | struct MaxwellDeviceMethods; |
| 15 | 15 | ||
| 16 | struct MaxwellDeviceTraits { | 16 | struct MaxwellDeviceTraits { |
| 17 | static constexpr bool supports_pinning = false; | ||
| 18 | static constexpr size_t device_virtual_bits = 34; | 17 | static constexpr size_t device_virtual_bits = 34; |
| 19 | using DeviceInterface = typename VideoCore::RasterizerInterface; | 18 | using DeviceInterface = typename VideoCore::RasterizerInterface; |
| 20 | using DeviceMethods = MaxwellDeviceMethods; | 19 | using DeviceMethods = MaxwellDeviceMethods; |