Memory Tracker: Use 64 bit atomics instead of 128 bits
This commit is contained in:
		| @@ -16,7 +16,10 @@ namespace Core { | ||||
|  | ||||
| class GPUDirtyMemoryManager { | ||||
| public: | ||||
|     GPUDirtyMemoryManager() : current{default_transform} {} | ||||
|     GPUDirtyMemoryManager() : current{default_transform} { | ||||
|         back_buffer.reserve(256); | ||||
|         front_buffer.reserve(256); | ||||
|     } | ||||
|  | ||||
|     ~GPUDirtyMemoryManager() = default; | ||||
|  | ||||
| @@ -62,7 +65,8 @@ public: | ||||
|                 mask = mask >> empty_bits; | ||||
|  | ||||
|                 const size_t continuous_bits = std::countr_one(mask); | ||||
|                 callback((transform.address << page_bits) + offset, continuous_bits << align_bits); | ||||
|                 callback((static_cast<VAddr>(transform.address) << page_bits) + offset, | ||||
|                          continuous_bits << align_bits); | ||||
|                 mask = continuous_bits < align_size ? (mask >> continuous_bits) : 0; | ||||
|                 offset += continuous_bits << align_bits; | ||||
|             } | ||||
| @@ -71,19 +75,19 @@ public: | ||||
|     } | ||||
|  | ||||
| private: | ||||
|     struct alignas(16) TransformAddress { | ||||
|         VAddr address; | ||||
|         u64 mask; | ||||
|     struct alignas(8) TransformAddress { | ||||
|         u32 address; | ||||
|         u32 mask; | ||||
|     }; | ||||
|  | ||||
|     constexpr static size_t page_bits = Memory::YUZU_PAGEBITS; | ||||
|     constexpr static size_t page_bits = Memory::YUZU_PAGEBITS - 1; | ||||
|     constexpr static size_t page_size = 1ULL << page_bits; | ||||
|     constexpr static size_t page_mask = page_size - 1; | ||||
|  | ||||
|     constexpr static size_t align_bits = 6U; | ||||
|     constexpr static size_t align_size = 1U << align_bits; | ||||
|     constexpr static size_t align_mask = align_size - 1; | ||||
|     constexpr static TransformAddress default_transform = {.address = ~0ULL, .mask = 0ULL}; | ||||
|     constexpr static TransformAddress default_transform = {.address = ~0U, .mask = 0U}; | ||||
|  | ||||
|     bool IsValid(VAddr address) { | ||||
|         return address < (1ULL << 39); | ||||
| @@ -104,8 +108,8 @@ private: | ||||
|         const size_t minor_bit = minor_address >> align_bits; | ||||
|         const size_t top_bit = (minor_address + size + align_mask) >> align_bits; | ||||
|         TransformAddress result{}; | ||||
|         result.address = address >> page_bits; | ||||
|         result.mask = CreateMask<u64>(top_bit, minor_bit); | ||||
|         result.address = static_cast<u32>(address >> page_bits); | ||||
|         result.mask = CreateMask<u32>(top_bit, minor_bit); | ||||
|         return result; | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user