mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-09-25 18:59:02 +00:00
rsx: Avoid clobbering CELL memory when splitting fbos
This commit is contained in:
parent
4417701ea7
commit
765208a181
3 changed files with 28 additions and 2 deletions
|
@ -3237,6 +3237,22 @@ namespace rsx
|
||||||
return m_predictor;
|
return m_predictor;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool is_protected(u32 section_base_address)
|
||||||
|
{
|
||||||
|
reader_lock lock(m_cache_mutex);
|
||||||
|
|
||||||
|
const auto& block = m_storage.block_for(section_base_address);
|
||||||
|
for (const auto& tex : block)
|
||||||
|
{
|
||||||
|
if (tex.get_section_base() == section_base_address)
|
||||||
|
{
|
||||||
|
return tex.is_locked();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The read only texture invalidate flag is set if a read only texture is trampled by framebuffer memory
|
* The read only texture invalidate flag is set if a read only texture is trampled by framebuffer memory
|
||||||
|
|
|
@ -318,9 +318,14 @@ void GLGSRender::init_buffers(rsx::framebuffer_creation_context context, bool /*
|
||||||
|
|
||||||
for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces)
|
for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces)
|
||||||
{
|
{
|
||||||
const bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer :
|
bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer :
|
||||||
!!g_cfg.video.write_color_buffers;
|
!!g_cfg.video.write_color_buffers;
|
||||||
|
|
||||||
|
if (lock && !m_gl_texture_cache.is_protected(base_addr))
|
||||||
|
{
|
||||||
|
lock = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!lock) [[likely]]
|
if (!lock) [[likely]]
|
||||||
{
|
{
|
||||||
m_gl_texture_cache.commit_framebuffer_memory_region(cmd, surface->get_memory_range());
|
m_gl_texture_cache.commit_framebuffer_memory_region(cmd, surface->get_memory_range());
|
||||||
|
|
|
@ -2423,9 +2423,14 @@ void VKGSRender::prepare_rtts(rsx::framebuffer_creation_context context)
|
||||||
|
|
||||||
for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces)
|
for (auto& [base_addr, surface] : m_rtts.orphaned_surfaces)
|
||||||
{
|
{
|
||||||
const bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer :
|
bool lock = surface->is_depth_surface() ? !!g_cfg.video.write_depth_buffer :
|
||||||
!!g_cfg.video.write_color_buffers;
|
!!g_cfg.video.write_color_buffers;
|
||||||
|
|
||||||
|
if (lock && !m_texture_cache.is_protected(base_addr))
|
||||||
|
{
|
||||||
|
lock = false;
|
||||||
|
}
|
||||||
|
|
||||||
if (!lock) [[likely]]
|
if (!lock) [[likely]]
|
||||||
{
|
{
|
||||||
m_texture_cache.commit_framebuffer_memory_region(*m_current_command_buffer, surface->get_memory_range());
|
m_texture_cache.commit_framebuffer_memory_region(*m_current_command_buffer, surface->get_memory_range());
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue