gsp: always pass through synchronization barrier for commands
This commit is contained in:
parent
f2f638492b
commit
7dd18a8df9
@ -8,6 +8,7 @@
|
|||||||
|
|
||||||
#include "core/mem_map.h"
|
#include "core/mem_map.h"
|
||||||
#include "core/hle/hle.h"
|
#include "core/hle/hle.h"
|
||||||
|
#include "core/hle/kernel/event.h"
|
||||||
#include "core/hle/service/gsp.h"
|
#include "core/hle/service/gsp.h"
|
||||||
|
|
||||||
#include "core/hw/lcd.h"
|
#include "core/hw/lcd.h"
|
||||||
@ -52,6 +53,7 @@ void GX_FinishCommand(u32 thread_id) {
|
|||||||
|
|
||||||
namespace GSP_GPU {
|
namespace GSP_GPU {
|
||||||
|
|
||||||
|
Handle g_event_handle = 0;
|
||||||
u32 g_thread_id = 0;
|
u32 g_thread_id = 0;
|
||||||
|
|
||||||
enum {
|
enum {
|
||||||
@ -100,7 +102,20 @@ void ReadHWRegs(Service::Interface* self) {
|
|||||||
void RegisterInterruptRelayQueue(Service::Interface* self) {
|
void RegisterInterruptRelayQueue(Service::Interface* self) {
|
||||||
u32* cmd_buff = Service::GetCommandBuffer();
|
u32* cmd_buff = Service::GetCommandBuffer();
|
||||||
u32 flags = cmd_buff[1];
|
u32 flags = cmd_buff[1];
|
||||||
u32 event_handle = cmd_buff[3]; // TODO(bunnei): Implement event handling
|
u32 event_handle = cmd_buff[3];
|
||||||
|
|
||||||
|
_assert_msg_(GSP, event_handle, "called, but event is NULL!");
|
||||||
|
|
||||||
|
g_event_handle = event_handle;
|
||||||
|
|
||||||
|
Kernel::SetEventLocked(event_handle, false);
|
||||||
|
|
||||||
|
// Hack - This function will permanently set the state of the GSP event such that GPU command
|
||||||
|
// synchronization barriers always passthrough. Correct solution would be to set this after the
|
||||||
|
// GPU as processed all queued up commands, but due to the emulator being single-threaded they
|
||||||
|
// will always be ready.
|
||||||
|
Kernel::SetPermanentLock(event_handle, true);
|
||||||
|
|
||||||
cmd_buff[2] = g_thread_id; // ThreadID
|
cmd_buff[2] = g_thread_id; // ThreadID
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user