rsx: Fix parsing of broken command streams with hanging begin/end commands without a pair.

- While these are game bugs, the parser shouldn't break on encountering them.
This commit is contained in:
kd-11 2022-10-11 19:22:36 +03:00 committed by kd-11
parent 3fe9aea5b5
commit 0737c788fc
3 changed files with 9 additions and 7 deletions

View file

@ -440,7 +440,7 @@ namespace rsx
{ {
enabled = _enabled; enabled = _enabled;
num_collapsed = 0; num_collapsed = 0;
begin_end_ctr = 0; in_begin_end = false;
} }
void flattening_helper::force_disable() void flattening_helper::force_disable()
@ -506,7 +506,7 @@ namespace rsx
{ {
// If its set to unoptimizable, we already tried and it did not work // If its set to unoptimizable, we already tried and it did not work
// If it resets to load low (usually after some kind of loading screen) we can try again // If it resets to load low (usually after some kind of loading screen) we can try again
ensure(begin_end_ctr == 0); // "Incorrect initial state" ensure(in_begin_end == false); // "Incorrect initial state"
ensure(num_collapsed == 0); ensure(num_collapsed == 0);
enabled = true; enabled = true;
} }
@ -520,7 +520,7 @@ namespace rsx
{ {
case NV4097_SET_BEGIN_END: case NV4097_SET_BEGIN_END:
{ {
begin_end_ctr ^= 1; in_begin_end = !!command.value;
if (command.value) if (command.value)
{ {
@ -550,7 +550,7 @@ namespace rsx
else else
{ {
rsx_log.error("Fifo flattener misalignment, disable FIFO reordering and report to developers"); rsx_log.error("Fifo flattener misalignment, disable FIFO reordering and report to developers");
begin_end_ctr = 0; in_begin_end = false;
flush_cmd = 0u; flush_cmd = 0u;
} }
@ -574,7 +574,7 @@ namespace rsx
else else
{ {
// Flush // Flush
flush_cmd = (begin_end_ctr) ? deferred_primitive : 0u; flush_cmd = (in_begin_end) ? deferred_primitive : 0u;
} }
} }
else else
@ -593,7 +593,7 @@ namespace rsx
draw_count = 0; draw_count = 0;
deferred_primitive = flush_cmd; deferred_primitive = flush_cmd;
return (begin_end_ctr == 1)? EMIT_BARRIER : EMIT_END; return in_begin_end ? EMIT_BARRIER : EMIT_END;
} }
return NOTHING; return NOTHING;

View file

@ -90,7 +90,7 @@ namespace rsx
u32 deferred_primitive = 0; u32 deferred_primitive = 0;
u32 draw_count = 0; u32 draw_count = 0;
u32 begin_end_ctr = 0; bool in_begin_end = false;
bool enabled = false; bool enabled = false;
u32 num_collapsed = 0; u32 num_collapsed = 0;

View file

@ -627,7 +627,9 @@ namespace rsx
} }
} }
else else
{
rsx::method_registers.current_draw_clause.is_immediate_draw = false; rsx::method_registers.current_draw_clause.is_immediate_draw = false;
}
if (!rsx::method_registers.current_draw_clause.empty()) if (!rsx::method_registers.current_draw_clause.empty())
{ {