java-topology/defects/citra-0001/patch/citra-0001.patch

48 lines
2.2 KiB
Diff

# UNDF: UNDF-2026-000001067
--- a/src/video_core/rasterizer_cache/rasterizer_cache_base.h
+++ b/src/video_core/rasterizer_cache/rasterizer_cache_base.h
@@ -5,6 +5,7 @@
#pragma once
#include <functional>
+#include <unordered_set>
#include <list>
#include <optional>
#include <span>
@@ -215,7 +215,7 @@ private:
std::unordered_map<TextureCubeConfig, TextureCube> texture_cube_cache;
- tsl::robin_pg_map<u64, std::vector<SurfaceId>, Common::IdentityHash<u64>> page_table;
+ tsl::robin_pg_map<u64, std::unordered_set<SurfaceId>, Common::IdentityHash<u64>> page_table;
std::unordered_map<FramebufferParams, FramebufferId> framebuffers;
--- a/src/video_core/rasterizer_cache/rasterizer_cache.h
+++ b/src/video_core/rasterizer_cache/rasterizer_cache.h
@@ -820,7 +820,7 @@ void RasterizerCache<T>::ForEachSurfaceInRegion(PAddr addr, std::size_t size, F
for (const SurfaceId surface_id : it->second) {
@@ -1365,8 +1365,8 @@ void RasterizerCache<T>::RegisterSurface(SurfaceId surface_id) {
UpdatePagesCachedCount(surface.addr, surface.size, 1);
ForEachPage(surface.addr, surface.size,
- [this, surface_id](u64 page) { page_table[page].push_back(surface_id); });
+ [this, surface_id](u64 page) { page_table[page].insert(surface_id); });
}
@@ -1379,12 +1379,10 @@ void RasterizerCache<T>::UnregisterSurface(SurfaceId surface_id) {
ForEachPage(surface.addr, surface.size, [this, surface_id](u64 page) {
const auto page_it = page_table.find(page);
if (page_it == page_table.end()) {
ASSERT_MSG(false, "Unregistering unregistered page=0x{:x}", page << CITRA_PAGEBITS);
return;
}
- std::vector<SurfaceId>& surfaces = page_it.value();
- const auto vector_it = std::find(surfaces.begin(), surfaces.end(), surface_id);
- if (vector_it == surfaces.end()) {
+ std::unordered_set<SurfaceId>& surfaces = page_it.value();
+ if (surfaces.find(surface_id) == surfaces.end()) {
ASSERT_MSG(false, "Unregistering unregistered surface in page=0x{:x}",
page << CITRA_PAGEBITS);
return;
}
- surfaces.erase(vector_it);
+ surfaces.erase(surface_id);
});