GPU: Be robust against nullptr addresses; properly reset busy bits in the trigger registers.
This commit is contained in:
parent
279e19732c
commit
93d66475d4
|
@ -101,7 +101,8 @@ inline void Write(u32 addr, const T data) {
|
||||||
const bool is_second_filler = (index != GPU_REG_INDEX(memory_fill_config[0].trigger));
|
const bool is_second_filler = (index != GPU_REG_INDEX(memory_fill_config[0].trigger));
|
||||||
auto& config = g_regs.memory_fill_config[is_second_filler];
|
auto& config = g_regs.memory_fill_config[is_second_filler];
|
||||||
|
|
||||||
if (config.address_start && config.trigger) {
|
if (config.trigger) {
|
||||||
|
if (config.address_start) { // Some games pass invalid values here
|
||||||
u8* start = Memory::GetPhysicalPointer(config.GetStartAddress());
|
u8* start = Memory::GetPhysicalPointer(config.GetStartAddress());
|
||||||
u8* end = Memory::GetPhysicalPointer(config.GetEndAddress());
|
u8* end = Memory::GetPhysicalPointer(config.GetEndAddress());
|
||||||
|
|
||||||
|
@ -124,9 +125,6 @@ inline void Write(u32 addr, const T data) {
|
||||||
|
|
||||||
LOG_TRACE(HW_GPU, "MemoryFill from 0x%08x to 0x%08x", config.GetStartAddress(), config.GetEndAddress());
|
LOG_TRACE(HW_GPU, "MemoryFill from 0x%08x to 0x%08x", config.GetStartAddress(), config.GetEndAddress());
|
||||||
|
|
||||||
config.trigger = 0;
|
|
||||||
config.finished = 1;
|
|
||||||
|
|
||||||
if (!is_second_filler) {
|
if (!is_second_filler) {
|
||||||
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC0);
|
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PSC0);
|
||||||
} else {
|
} else {
|
||||||
|
@ -135,6 +133,12 @@ inline void Write(u32 addr, const T data) {
|
||||||
|
|
||||||
VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetStartAddress(), config.GetEndAddress() - config.GetStartAddress());
|
VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetStartAddress(), config.GetEndAddress() - config.GetStartAddress());
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Reset "trigger" flag and set the "finish" flag
|
||||||
|
// NOTE: This was confirmed to happen on hardware even if "address_start" is zero.
|
||||||
|
config.trigger = 0;
|
||||||
|
config.finished = 1;
|
||||||
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -270,6 +274,7 @@ inline void Write(u32 addr, const T data) {
|
||||||
config.GetPhysicalOutputAddress(), output_width, output_height,
|
config.GetPhysicalOutputAddress(), output_width, output_height,
|
||||||
config.output_format.Value(), config.flags);
|
config.output_format.Value(), config.flags);
|
||||||
|
|
||||||
|
g_regs.display_transfer_config.trigger = 0;
|
||||||
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PPF);
|
GSP_GPU::SignalInterrupt(GSP_GPU::InterruptId::PPF);
|
||||||
|
|
||||||
VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetPhysicalOutputAddress(), output_size);
|
VideoCore::g_renderer->hw_rasterizer->NotifyFlush(config.GetPhysicalOutputAddress(), output_size);
|
||||||
|
@ -285,6 +290,8 @@ inline void Write(u32 addr, const T data) {
|
||||||
{
|
{
|
||||||
u32* buffer = (u32*)Memory::GetPhysicalPointer(config.GetPhysicalAddress());
|
u32* buffer = (u32*)Memory::GetPhysicalPointer(config.GetPhysicalAddress());
|
||||||
Pica::CommandProcessor::ProcessCommandList(buffer, config.size);
|
Pica::CommandProcessor::ProcessCommandList(buffer, config.size);
|
||||||
|
|
||||||
|
g_regs.command_processor_config.trigger = 0;
|
||||||
}
|
}
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
Reference in New Issue