citra-emu
/
citra-canary
Archived
1
0
Fork 0

gsp::Gpu: implement AcquireRight, ReleaseRight functions

This commit is contained in:
mailwl 2016-04-22 21:13:01 +03:00
parent 57a5fc40c0
commit efdff9ad3e
1 changed files with 37 additions and 8 deletions

View File

@ -44,6 +44,8 @@ Kernel::SharedPtr<Kernel::SharedMemory> g_shared_memory;
/// Thread index into interrupt relay queue /// Thread index into interrupt relay queue
u32 g_thread_id = 0; u32 g_thread_id = 0;
static bool gpu_right_acquired = false;
/// Gets a pointer to a thread command buffer in GSP shared memory /// Gets a pointer to a thread command buffer in GSP shared memory
static inline u8* GetCommandBuffer(u32 thread_id) { static inline u8* GetCommandBuffer(u32 thread_id) {
return g_shared_memory->GetPointer(0x800 + (thread_id * sizeof(CommandBuffer))); return g_shared_memory->GetPointer(0x800 + (thread_id * sizeof(CommandBuffer)));
@ -371,14 +373,10 @@ static void UnregisterInterruptRelayQueue(Service::Interface* self) {
* @todo This probably does not belong in the GSP module, instead move to video_core * @todo This probably does not belong in the GSP module, instead move to video_core
*/ */
void SignalInterrupt(InterruptId interrupt_id) { void SignalInterrupt(InterruptId interrupt_id) {
if (nullptr == g_interrupt_event) { if (!gpu_right_acquired) {
LOG_WARNING(Service_GSP, "cannot synchronize until GSP event has been created!");
return;
}
if (nullptr == g_shared_memory) {
LOG_WARNING(Service_GSP, "cannot synchronize until GSP shared memory has been created!");
return; return;
} }
for (int thread_id = 0; thread_id < 0x4; ++thread_id) { for (int thread_id = 0; thread_id < 0x4; ++thread_id) {
InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id); InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id);
u8 next = interrupt_relay_queue->index; u8 next = interrupt_relay_queue->index;
@ -625,6 +623,35 @@ static void ImportDisplayCaptureInfo(Service::Interface* self) {
LOG_WARNING(Service_GSP, "called"); LOG_WARNING(Service_GSP, "called");
} }
/**
* GSP_GPU::AcquireRight service function
* Outputs:
* 1: Result code
*/
static void AcquireRight(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
gpu_right_acquired = true;
cmd_buff[1] = RESULT_SUCCESS.raw;
LOG_WARNING(Service_GSP, "called");
}
/**
* GSP_GPU::ReleaseRight service function
* Outputs:
* 1: Result code
*/
static void ReleaseRight(Service::Interface* self) {
u32* cmd_buff = Kernel::GetCommandBuffer();
gpu_right_acquired = false;
cmd_buff[1] = RESULT_SUCCESS.raw;
LOG_WARNING(Service_GSP, "called");
}
const Interface::FunctionInfo FunctionTable[] = { const Interface::FunctionInfo FunctionTable[] = {
{0x00010082, WriteHWRegs, "WriteHWRegs"}, {0x00010082, WriteHWRegs, "WriteHWRegs"},
@ -648,8 +675,8 @@ const Interface::FunctionInfo FunctionTable[] = {
{0x00130042, RegisterInterruptRelayQueue, "RegisterInterruptRelayQueue"}, {0x00130042, RegisterInterruptRelayQueue, "RegisterInterruptRelayQueue"},
{0x00140000, UnregisterInterruptRelayQueue, "UnregisterInterruptRelayQueue"}, {0x00140000, UnregisterInterruptRelayQueue, "UnregisterInterruptRelayQueue"},
{0x00150002, nullptr, "TryAcquireRight"}, {0x00150002, nullptr, "TryAcquireRight"},
{0x00160042, nullptr, "AcquireRight"}, {0x00160042, AcquireRight, "AcquireRight"},
{0x00170000, nullptr, "ReleaseRight"}, {0x00170000, ReleaseRight, "ReleaseRight"},
{0x00180000, ImportDisplayCaptureInfo, "ImportDisplayCaptureInfo"}, {0x00180000, ImportDisplayCaptureInfo, "ImportDisplayCaptureInfo"},
{0x00190000, nullptr, "SaveVramSysArea"}, {0x00190000, nullptr, "SaveVramSysArea"},
{0x001A0000, nullptr, "RestoreVramSysArea"}, {0x001A0000, nullptr, "RestoreVramSysArea"},
@ -670,11 +697,13 @@ Interface::Interface() {
g_shared_memory = nullptr; g_shared_memory = nullptr;
g_thread_id = 0; g_thread_id = 0;
gpu_right_acquired = false;
} }
Interface::~Interface() { Interface::~Interface() {
g_interrupt_event = nullptr; g_interrupt_event = nullptr;
g_shared_memory = nullptr; g_shared_memory = nullptr;
gpu_right_acquired = false;
} }
} // namespace } // namespace