diff --git a/src/common/slot_vector.h b/src/common/slot_vector.h index ba49f8997..1fc4f454d 100644 --- a/src/common/slot_vector.h +++ b/src/common/slot_vector.h @@ -14,9 +14,6 @@ namespace Common { struct SlotId { static constexpr u32 INVALID_INDEX = std::numeric_limits::max(); - SlotId() noexcept = default; - constexpr SlotId(u32 index) noexcept : index(index) {} - constexpr auto operator<=>(const SlotId&) const noexcept = default; constexpr explicit operator bool() const noexcept { @@ -31,64 +28,6 @@ class SlotVector { constexpr static std::size_t InitialCapacity = 2048; public: - template - class Iterator { - public: - using iterator_category = std::forward_iterator_tag; - using value_type = ValueType; - using difference_type = std::ptrdiff_t; - using pointer = Pointer; - using reference = Reference; - - Iterator(SlotVector& vector_, SlotId index_) - : vector(vector_), slot(index_) { - AdvanceToValid(); - } - - reference operator*() const { - return vector[slot]; - } - - pointer operator->() const { - return &vector[slot]; - } - - Iterator& operator++() { - ++slot.index; - AdvanceToValid(); - return *this; - } - - Iterator operator++(int) { - Iterator temp = *this; - ++(*this); - return temp; - } - - bool operator==(const Iterator& other) const { - return slot == other.slot; - } - - bool operator!=(const Iterator& other) const { - return !(*this == other); - } - - private: - void AdvanceToValid() { - while (slot < vector.values_capacity && !vector.ReadStorageBit(slot.index)) { - ++slot.index; - } - } - - SlotVector& vector; - SlotId slot; - }; - - using iterator = Iterator; - using const_iterator = Iterator; - using reverse_iterator = std::reverse_iterator; - using const_reverse_iterator = std::reverse_iterator; - SlotVector() { Reserve(InitialCapacity); } @@ -139,54 +78,6 @@ public: return values_capacity - free_list.size(); } - iterator begin() noexcept { - return iterator(*this, 0); - } - - const_iterator begin() const noexcept { - return const_iterator(*this, 0); - } - - const_iterator cbegin() const noexcept { - return begin(); - } - - iterator end() noexcept { - return iterator(*this, values_capacity); - } - - const_iterator end() const noexcept { - return const_iterator(*this, values_capacity); - } - - const_iterator cend() const noexcept { - return end(); - } - - reverse_iterator rbegin() noexcept { - return reverse_iterator(end()); - } - - const_reverse_iterator rbegin() const noexcept { - return const_reverse_iterator(end()); - } - - const_reverse_iterator crbegin() const noexcept { - return rbegin(); - } - - reverse_iterator rend() noexcept { - return reverse_iterator(begin()); - } - - const_reverse_iterator rend() const noexcept { - return const_reverse_iterator(begin()); - } - - const_reverse_iterator crend() const noexcept { - return rend(); - } - private: struct NonTrivialDummy { NonTrivialDummy() noexcept {} diff --git a/src/video_core/buffer_cache/buffer_cache.cpp b/src/video_core/buffer_cache/buffer_cache.cpp index 684b93955..70e7e7d83 100644 --- a/src/video_core/buffer_cache/buffer_cache.cpp +++ b/src/video_core/buffer_cache/buffer_cache.cpp @@ -830,8 +830,13 @@ void BufferCache::SynchronizeRange(VAddr device_addr, u32 size) { return; } VAddr device_addr_end = device_addr + size; - ForEachBufferInRange(device_addr, size, [&](Buffer& buffer, VAddr addr, u32 size) { - SynchronizeBuffer(buffer, addr, size, false); + ForEachBufferInRange(device_addr, size, [&](BufferId buffer_id, Buffer& buffer) { + VAddr buffer_start = buffer.CpuAddr(); + VAddr buffer_end = buffer_start + buffer.SizeBytes(); + VAddr start = std::max(buffer_start, device_addr); + VAddr end = std::min(buffer_end, device_addr_end); + u32 size = static_cast(end - start); + SynchronizeBuffer(buffer, start, size, false); }); } diff --git a/src/video_core/buffer_cache/buffer_cache.h b/src/video_core/buffer_cache/buffer_cache.h index 7f288645d..39992ea07 100644 --- a/src/video_core/buffer_cache/buffer_cache.h +++ b/src/video_core/buffer_cache/buffer_cache.h @@ -147,17 +147,18 @@ public: private: template void ForEachBufferInRange(VAddr device_addr, u64 size, Func&& func) { - std::shared_lock lk{slot_buffers_mutex}; - const VAddr device_addr_end = device_addr + size; - for (auto& buffer : slot_buffers) { - if (buffer.is_deleted) { + const u64 page_end = Common::DivCeil(device_addr + size, CACHING_PAGESIZE); + for (u64 page = device_addr >> CACHING_PAGEBITS; page < page_end;) { + const BufferId buffer_id = page_table[page]; + if (!buffer_id) { + ++page; continue; } - const VAddr start = std::max(buffer.CpuAddr(), device_addr); - const VAddr end = std::min(buffer.CpuAddr() + buffer.SizeBytes(), device_addr_end); - if (start < end) { - func(buffer, start, end - start); - } + Buffer& buffer = slot_buffers[buffer_id]; + func(buffer_id, buffer); + + const VAddr end_addr = buffer.CpuAddr() + buffer.SizeBytes(); + page = Common::DivCeil(end_addr, CACHING_PAGESIZE); } }