mirror of
https://github.com/RPCS3/rpcs3.git
synced 2024-11-23 03:02:53 +01:00
rsx: Brute-force removal of superseded surfaces
This commit is contained in:
parent
182b20c33d
commit
42a9ac9e6c
@ -61,6 +61,9 @@ namespace rsx
|
|||||||
// List of sections derived from a section that has been split and invalidated
|
// List of sections derived from a section that has been split and invalidated
|
||||||
std::vector<surface_type> orphaned_surfaces;
|
std::vector<surface_type> orphaned_surfaces;
|
||||||
|
|
||||||
|
// List of sections that have been wholly inherited and invalidated
|
||||||
|
std::vector<surface_type> superseded_surfaces;
|
||||||
|
|
||||||
std::list<surface_storage_type> invalidated_resources;
|
std::list<surface_storage_type> invalidated_resources;
|
||||||
u64 cache_tag = 1ull; // Use 1 as the start since 0 is default tag on new surfaces
|
u64 cache_tag = 1ull; // Use 1 as the start since 0 is default tag on new surfaces
|
||||||
u64 write_tag = 1ull;
|
u64 write_tag = 1ull;
|
||||||
@ -410,6 +413,7 @@ namespace rsx
|
|||||||
|
|
||||||
invalidate(object);
|
invalidate(object);
|
||||||
storage.erase(e.first);
|
storage.erase(e.first);
|
||||||
|
superseded_surfaces.push_back(surface);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -753,14 +753,6 @@ namespace rsx
|
|||||||
tex.is_flushable() &&
|
tex.is_flushable() &&
|
||||||
tex.get_section_base() != fault_range_in.start)
|
tex.get_section_base() != fault_range_in.start)
|
||||||
{
|
{
|
||||||
if (tex.get_context() == texture_upload_context::framebuffer_storage &&
|
|
||||||
tex.inside(fault_range, section_bounds::full_range))
|
|
||||||
{
|
|
||||||
// FBO data 'lives on' in the new region. Surface cache handles memory intersection for us.
|
|
||||||
verify(HERE), tex.inside(fault_range, section_bounds::locked_range);
|
|
||||||
tex.discard(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
// HACK: When being superseded by an fbo, we preserve overlapped flushables unless the start addresses match
|
// HACK: When being superseded by an fbo, we preserve overlapped flushables unless the start addresses match
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
@ -1174,6 +1166,20 @@ namespace rsx
|
|||||||
invalidate_range_impl_base(cmd, rsx_range, invalidation_cause::committed_as_fbo, std::forward<Args>(extras)...);
|
invalidate_range_impl_base(cmd, rsx_range, invalidation_cause::committed_as_fbo, std::forward<Args>(extras)...);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
template <typename ...Args>
|
||||||
|
void discard_framebuffer_memory_region(commandbuffer_type& cmd, const address_range& rsx_range, Args&&... extras)
|
||||||
|
{
|
||||||
|
if (g_cfg.video.write_color_buffers || g_cfg.video.write_depth_buffer)
|
||||||
|
{
|
||||||
|
auto* region_ptr = find_cached_texture(rsx_range, RSX_GCM_FORMAT_IGNORED, false, false);
|
||||||
|
if (region_ptr && region_ptr->is_locked() && region_ptr->get_context() == texture_upload_context::framebuffer_storage)
|
||||||
|
{
|
||||||
|
verify(HERE), region_ptr->get_protection() == utils::protection::no;
|
||||||
|
region_ptr->discard(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void set_memory_read_flags(const address_range &memory_range, memory_read_flags flags)
|
void set_memory_read_flags(const address_range &memory_range, memory_read_flags flags)
|
||||||
{
|
{
|
||||||
std::lock_guard lock(m_cache_mutex);
|
std::lock_guard lock(m_cache_mutex);
|
||||||
|
@ -329,6 +329,16 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool sk
|
|||||||
|
|
||||||
m_gl_texture_cache.clear_ro_tex_invalidate_intr();
|
m_gl_texture_cache.clear_ro_tex_invalidate_intr();
|
||||||
|
|
||||||
|
if (!m_rtts.superseded_surfaces.empty())
|
||||||
|
{
|
||||||
|
for (auto& surface : m_rtts.superseded_surfaces)
|
||||||
|
{
|
||||||
|
m_gl_texture_cache.discard_framebuffer_memory_region(cmd, surface->get_memory_range());
|
||||||
|
}
|
||||||
|
|
||||||
|
m_rtts.superseded_surfaces.clear();
|
||||||
|
}
|
||||||
|
|
||||||
const auto color_format = rsx::internals::surface_color_format_to_gl(m_framebuffer_layout.color_format);
|
const auto color_format = rsx::internals::surface_color_format_to_gl(m_framebuffer_layout.color_format);
|
||||||
for (u8 i = 0; i < rsx::limits::color_buffers_count; ++i)
|
for (u8 i = 0; i < rsx::limits::color_buffers_count; ++i)
|
||||||
{
|
{
|
||||||
|
Loading…
Reference in New Issue
Block a user