mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-03-29 22:20:48 +00:00
rsx: Plug texture data leak in the 'exact match' path.
- Followup to previous texture data leak fix for the replaced section path.
This commit is contained in:
parent
e7b24461ec
commit
36d5db7f30
@ -87,12 +87,6 @@ namespace rsx
|
|||||||
deferred_clipped_region<surface_type>& region,
|
deferred_clipped_region<surface_type>& region,
|
||||||
std::unordered_map<u32, surface_storage_type>& data)
|
std::unordered_map<u32, surface_storage_type>& data)
|
||||||
{
|
{
|
||||||
verify(HERE), prev_surface;
|
|
||||||
if (prev_surface->read_barrier(cmd); !prev_surface->test())
|
|
||||||
{
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
surface_storage_type sink;
|
surface_storage_type sink;
|
||||||
surface_type invalidated = 0;
|
surface_type invalidated = 0;
|
||||||
if (const auto found = data.find(new_address);
|
if (const auto found = data.find(new_address);
|
||||||
@ -100,6 +94,12 @@ namespace rsx
|
|||||||
{
|
{
|
||||||
if (Traits::is_compatible_surface(Traits::get(found->second), region.source, region.width, region.height, 1))
|
if (Traits::is_compatible_surface(Traits::get(found->second), region.source, region.width, region.height, 1))
|
||||||
{
|
{
|
||||||
|
if (found->second->last_use_tag >= prev_surface->last_use_tag)
|
||||||
|
{
|
||||||
|
// If memory in this block is newer, do not overwrite with stale data
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
// There is no need to erase due to the reinsertion below
|
// There is no need to erase due to the reinsertion below
|
||||||
sink = std::move(found->second);
|
sink = std::move(found->second);
|
||||||
}
|
}
|
||||||
@ -160,6 +160,19 @@ namespace rsx
|
|||||||
_new.width = width * bpp * get_aa_factor_u(aa);
|
_new.width = width * bpp * get_aa_factor_u(aa);
|
||||||
_new.height = height * get_aa_factor_v(aa);
|
_new.height = height * get_aa_factor_v(aa);
|
||||||
|
|
||||||
|
if (old.width <= _new.width && old.height <= _new.height)
|
||||||
|
{
|
||||||
|
// No extra memory to be preserved
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// One-time data validity test
|
||||||
|
verify(HERE), prev_surface;
|
||||||
|
if (prev_surface->read_barrier(cmd); !prev_surface->test())
|
||||||
|
{
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
if (old.width > _new.width)
|
if (old.width > _new.width)
|
||||||
{
|
{
|
||||||
// Split in X
|
// Split in X
|
||||||
|
Loading…
x
Reference in New Issue
Block a user