rasterizer_cache: Handle texture cubes with duplicate faces (#6710)
This commit is contained in:
parent
a9e390b1b1
commit
b5e1a27a7e
|
@ -10,6 +10,7 @@
|
||||||
#include "common/alignment.h"
|
#include "common/alignment.h"
|
||||||
#include "common/logging/log.h"
|
#include "common/logging/log.h"
|
||||||
#include "common/microprofile.h"
|
#include "common/microprofile.h"
|
||||||
|
#include "common/scope_exit.h"
|
||||||
#include "common/settings.h"
|
#include "common/settings.h"
|
||||||
#include "core/memory.h"
|
#include "core/memory.h"
|
||||||
#include "video_core/custom_textures/custom_tex_manager.h"
|
#include "video_core/custom_textures/custom_tex_manager.h"
|
||||||
|
@ -1367,24 +1368,26 @@ void RasterizerCache<T>::UnregisterSurface(SurfaceId surface_id) {
|
||||||
surfaces.erase(vector_it);
|
surfaces.erase(vector_it);
|
||||||
});
|
});
|
||||||
|
|
||||||
if (True(surface.flags & SurfaceFlagBits::Tracked)) {
|
SCOPE_EXIT({ slot_surfaces.erase(surface_id); });
|
||||||
auto it = texture_cube_cache.begin();
|
|
||||||
while (it != texture_cube_cache.end()) {
|
if (False(surface.flags & SurfaceFlagBits::Tracked)) {
|
||||||
std::array<SurfaceId, 6>& face_ids = it->second.face_ids;
|
return;
|
||||||
const auto array_it = std::find(face_ids.begin(), face_ids.end(), surface_id);
|
|
||||||
if (array_it != face_ids.end()) {
|
|
||||||
*array_it = SurfaceId{};
|
|
||||||
}
|
|
||||||
if (std::none_of(face_ids.begin(), face_ids.end(), [](SurfaceId id) { return id; })) {
|
|
||||||
slot_surfaces.erase(it->second.surface_id);
|
|
||||||
it = texture_cube_cache.erase(it);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
it++;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
slot_surfaces.erase(surface_id);
|
std::erase_if(texture_cube_cache, [&](auto& pair) {
|
||||||
|
TextureCube& cube = pair.second;
|
||||||
|
for (SurfaceId& face_id : cube.face_ids) {
|
||||||
|
if (face_id == surface_id) {
|
||||||
|
face_id = SurfaceId{};
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (std::none_of(cube.face_ids.begin(), cube.face_ids.end(),
|
||||||
|
[](SurfaceId id) { return id; })) {
|
||||||
|
slot_surfaces.erase(cube.surface_id);
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
template <class T>
|
template <class T>
|
||||||
|
|
Reference in New Issue