mirror of
https://github.com/RPCS3/rpcs3.git
synced 2025-07-03 21:41:26 +12:00
rsx: use coverage ratio to determine when too much data is overlapping
This commit is contained in:
parent
92824b6729
commit
83026fd263
1 changed files with 28 additions and 6 deletions
|
@ -1875,23 +1875,45 @@ namespace rsx
|
||||||
if (result_is_valid)
|
if (result_is_valid)
|
||||||
{
|
{
|
||||||
// Check for possible duplicates
|
// Check for possible duplicates
|
||||||
usz max_safe_sections = u32{umax};
|
usz max_overdraw_ratio = u32{ umax };
|
||||||
|
usz max_safe_sections = u32{ umax };
|
||||||
|
|
||||||
switch (result.external_subresource_desc.op)
|
switch (result.external_subresource_desc.op)
|
||||||
{
|
{
|
||||||
case deferred_request_command::atlas_gather:
|
case deferred_request_command::atlas_gather:
|
||||||
max_safe_sections = 8 + 2 * attr.mipmaps; break;
|
max_overdraw_ratio = 150;
|
||||||
|
max_safe_sections = 8 + 2 * attr.mipmaps;
|
||||||
|
break;
|
||||||
case deferred_request_command::cubemap_gather:
|
case deferred_request_command::cubemap_gather:
|
||||||
max_safe_sections = 6 * 2 * attr.mipmaps; break;
|
max_overdraw_ratio = 150;
|
||||||
|
max_safe_sections = 6 * 2 * attr.mipmaps;
|
||||||
|
break;
|
||||||
case deferred_request_command::_3d_gather:
|
case deferred_request_command::_3d_gather:
|
||||||
max_safe_sections = (attr.depth * attr.mipmaps * 150) / 100; break;
|
// 3D gather can have very many input sections, try to keep section count low
|
||||||
|
max_overdraw_ratio = 125;
|
||||||
|
max_safe_sections = (attr.depth * attr.mipmaps * 110) / 100;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (overlapping_fbos.size() > max_safe_sections)
|
if (overlapping_fbos.size() > max_safe_sections)
|
||||||
{
|
{
|
||||||
rsx_log.error("[Performance warning] Texture gather routine encountered too many objects!");
|
// Are we really over-budget?
|
||||||
m_rtts.check_for_duplicates(overlapping_fbos, memory_range);
|
u32 coverage_size = 0;
|
||||||
|
for (const auto& section : overlapping_fbos)
|
||||||
|
{
|
||||||
|
const auto area = section.surface->get_native_pitch() * section.surface->get_surface_height(rsx::surface_metrics::bytes);
|
||||||
|
coverage_size += area;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (const auto coverage_ratio = (coverage_size * 100ull) / memory_range.length();
|
||||||
|
coverage_ratio > max_overdraw_ratio)
|
||||||
|
{
|
||||||
|
rsx_log.error("[Performance warning] Texture gather routine encountered too many objects! Operation=%d, Mipmaps=%d, Depth=%d, Sections=%zu, Ratio=%llu%",
|
||||||
|
static_cast<int>(result.external_subresource_desc.op), attr.mipmaps, attr.depth, overlapping_fbos.size(), coverage_ratio);
|
||||||
|
m_rtts.check_for_duplicates(overlapping_fbos, memory_range);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
// Optionally disallow caching if resource is being written to as it is being read from
|
// Optionally disallow caching if resource is being written to as it is being read from
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue