rsx: Compile shaders when CELL is not running

This commit is contained in:
Eladash 2021-03-21 18:55:47 +02:00 committed by Ivan
parent dea1d01de2
commit 1e71deb0db
4 changed files with 44 additions and 24 deletions

View file

@ -813,7 +813,6 @@ void try_spawn_ppu_if_exclusive_program(const ppu_module& m)
auto ppu = idm::make_ptr<named_thread<ppu_thread>>("PPU[0x1000000] Thread (test_thread)", p, "test_thread", 0); auto ppu = idm::make_ptr<named_thread<ppu_thread>>("PPU[0x1000000] Thread (test_thread)", p, "test_thread", 0);
ppu->cmd_push({ppu_cmd::initialize, 0});
ppu->cia = m.funcs[0].addr; ppu->cia = m.funcs[0].addr;
// For kernel explorer // For kernel explorer

View file

@ -943,7 +943,15 @@ void ppu_thread::cpu_task()
} }
case ppu_cmd::initialize: case ppu_cmd::initialize:
{ {
cmd_pop(), ppu_initialize(), spu_cache::initialize(); cmd_pop();
while (!g_fxo->get<rsx::thread>().is_inited && !is_stopped())
{
// Wait for RSX to be initialized
thread_ctrl::wait_on(g_fxo->get<rsx::thread>().is_inited, false);
}
ppu_initialize(), spu_cache::initialize();
break; break;
} }
case ppu_cmd::sleep: case ppu_cmd::sleep:

View file

@ -506,27 +506,12 @@ namespace rsx
void thread::cpu_task() void thread::cpu_task()
{ {
while (Emu.IsReady())
{ {
// Wait for startup (TODO)
while (m_rsx_thread_exiting)
{
// Wait for external pause events
if (external_interrupt_lock)
{
wait_pause();
}
thread_ctrl::wait_for(1000); thread_ctrl::wait_for(1000);
if (is_stopped())
{
return;
}
} }
on_task(); on_task();
}
on_exit(); on_exit();
} }
@ -548,7 +533,7 @@ namespace rsx
g_tls_log_prefix = [] g_tls_log_prefix = []
{ {
const auto rsx = get_current_renderer(); const auto rsx = get_current_renderer();
return fmt::format("RSX [0x%07x]", +rsx->ctrl->get); return fmt::format("RSX [0x%07x]", rsx->ctrl ? +rsx->ctrl->get : 0);
}; };
method_registers.init(); method_registers.init();
@ -558,12 +543,42 @@ namespace rsx
g_fxo->get<rsx::dma_manager>().init(); g_fxo->get<rsx::dma_manager>().init();
on_init_thread(); on_init_thread();
is_inited = true;
is_inited.notify_all();
if (!zcull_ctrl) if (!zcull_ctrl)
{ {
//Backend did not provide an implementation, provide NULL object //Backend did not provide an implementation, provide NULL object
zcull_ctrl = std::make_unique<::rsx::reports::ZCULL_control>(); zcull_ctrl = std::make_unique<::rsx::reports::ZCULL_control>();
} }
performance_counters.state = FIFO_state::empty;
// Wait for startup (TODO)
while (m_rsx_thread_exiting)
{
// Wait for external pause events
if (external_interrupt_lock)
{
wait_pause();
}
// Execute backend-local tasks first
do_local_task(performance_counters.state);
// Update sub-units
zcull_ctrl->update(this);
if (is_stopped())
{
return;
}
thread_ctrl::wait_for(1000);
}
performance_counters.state = FIFO_state::running;
fifo_ctrl = std::make_unique<::rsx::FIFO::FIFO_control>(this); fifo_ctrl = std::make_unique<::rsx::FIFO::FIFO_control>(this);
last_flip_time = get_system_time() - 1000000; last_flip_time = get_system_time() - 1000000;
@ -644,9 +659,6 @@ namespace rsx
thread_ctrl::set_thread_affinity_mask(thread_ctrl::get_affinity_mask(thread_class::rsx)); thread_ctrl::set_thread_affinity_mask(thread_ctrl::get_affinity_mask(thread_class::rsx));
} }
// Round to nearest to deal with forward/reverse scaling
fesetround(FE_TONEAREST);
while (!test_stopped()) while (!test_stopped())
{ {
// Wait for external pause events // Wait for external pause events

View file

@ -649,6 +649,7 @@ namespace rsx
u32 dbg_step_pc = 0; u32 dbg_step_pc = 0;
atomic_t<u32> external_interrupt_lock{ 0 }; atomic_t<u32> external_interrupt_lock{ 0 };
atomic_t<bool> external_interrupt_ack{ false }; atomic_t<bool> external_interrupt_ack{ false };
atomic_t<bool> is_inited{ false };
bool is_fifo_idle() const; bool is_fifo_idle() const;
void flush_fifo(); void flush_fifo();
void recover_fifo(); void recover_fifo();