diff options
Diffstat (limited to 'src/core/hle')
| -rw-r--r-- | src/core/hle/service/gsp_gpu.cpp | 13 |
1 files changed, 6 insertions, 7 deletions
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp index b03060ed3..34eabac45 100644 --- a/src/core/hle/service/gsp_gpu.cpp +++ b/src/core/hle/service/gsp_gpu.cpp | |||
| @@ -173,6 +173,7 @@ static void RegisterInterruptRelayQueue(Service::Interface* self) { | |||
| 173 | * Signals that the specified interrupt type has occurred to userland code | 173 | * Signals that the specified interrupt type has occurred to userland code |
| 174 | * @param interrupt_id ID of interrupt that is being signalled | 174 | * @param interrupt_id ID of interrupt that is being signalled |
| 175 | * @todo This should probably take a thread_id parameter and only signal this thread? | 175 | * @todo This should probably take a thread_id parameter and only signal this thread? |
| 176 | * @todo This probably does not belong in the GSP module, instead move to video_core | ||
| 176 | */ | 177 | */ |
| 177 | void SignalInterrupt(InterruptId interrupt_id) { | 178 | void SignalInterrupt(InterruptId interrupt_id) { |
| 178 | if (0 == g_interrupt_event) { | 179 | if (0 == g_interrupt_event) { |
| @@ -211,6 +212,7 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 211 | memcpy(Memory::GetPointer(command.dma_request.dest_address), | 212 | memcpy(Memory::GetPointer(command.dma_request.dest_address), |
| 212 | Memory::GetPointer(command.dma_request.source_address), | 213 | Memory::GetPointer(command.dma_request.source_address), |
| 213 | command.dma_request.size); | 214 | command.dma_request.size); |
| 215 | SignalInterrupt(InterruptId::DMA); | ||
| 214 | break; | 216 | break; |
| 215 | 217 | ||
| 216 | // ctrulib homebrew sends all relevant command list data with this command, | 218 | // ctrulib homebrew sends all relevant command list data with this command, |
| @@ -219,13 +221,13 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 219 | case CommandId::SET_COMMAND_LIST_LAST: | 221 | case CommandId::SET_COMMAND_LIST_LAST: |
| 220 | { | 222 | { |
| 221 | auto& params = command.set_command_list_last; | 223 | auto& params = command.set_command_list_last; |
| 224 | |||
| 222 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.address), Memory::VirtualToPhysicalAddress(params.address) >> 3); | 225 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.address), Memory::VirtualToPhysicalAddress(params.address) >> 3); |
| 223 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.size), params.size); | 226 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.size), params.size); |
| 224 | 227 | ||
| 225 | // TODO: Not sure if we are supposed to always write this .. seems to trigger processing though | 228 | // TODO: Not sure if we are supposed to always write this .. seems to trigger processing though |
| 226 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.trigger), 1); | 229 | WriteGPURegister(GPU_REG_INDEX(command_processor_config.trigger), 1); |
| 227 | 230 | ||
| 228 | SignalInterrupt(InterruptId::P3D); | ||
| 229 | break; | 231 | break; |
| 230 | } | 232 | } |
| 231 | 233 | ||
| @@ -243,6 +245,8 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 243 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_end), Memory::VirtualToPhysicalAddress(params.end2) >> 3); | 245 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].address_end), Memory::VirtualToPhysicalAddress(params.end2) >> 3); |
| 244 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].size), params.end2 - params.start2); | 246 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].size), params.end2 - params.start2); |
| 245 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].value), params.value2); | 247 | WriteGPURegister(GPU_REG_INDEX(memory_fill_config[1].value), params.value2); |
| 248 | |||
| 249 | SignalInterrupt(InterruptId::PSC0); | ||
| 246 | break; | 250 | break; |
| 247 | } | 251 | } |
| 248 | 252 | ||
| @@ -256,14 +260,9 @@ static void ExecuteCommand(const Command& command, u32 thread_id) { | |||
| 256 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags); | 260 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.flags), params.flags); |
| 257 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1); | 261 | WriteGPURegister(GPU_REG_INDEX(display_transfer_config.trigger), 1); |
| 258 | 262 | ||
| 259 | // TODO(bunnei): Signalling all of these interrupts here is totally wrong, but it seems to | 263 | // TODO(bunnei): Determine if these interrupts should be signalled here. |
| 260 | // work well enough for running demos. Need to figure out how these all work and trigger | ||
| 261 | // them correctly. | ||
| 262 | SignalInterrupt(InterruptId::PSC0); | ||
| 263 | SignalInterrupt(InterruptId::PSC1); | 264 | SignalInterrupt(InterruptId::PSC1); |
| 264 | SignalInterrupt(InterruptId::PPF); | 265 | SignalInterrupt(InterruptId::PPF); |
| 265 | SignalInterrupt(InterruptId::P3D); | ||
| 266 | SignalInterrupt(InterruptId::DMA); | ||
| 267 | 266 | ||
| 268 | // Update framebuffer information if requested | 267 | // Update framebuffer information if requested |
| 269 | for (int screen_id = 0; screen_id < 2; ++screen_id) { | 268 | for (int screen_id = 0; screen_id < 2; ++screen_id) { |