summaryrefslogtreecommitdiff
path: root/src/core/hle
diff options
context:
space:
mode:
authorGravatar Yuri Kunde Schlesner2015-01-14 03:26:27 -0200
committerGravatar Yuri Kunde Schlesner2015-01-14 05:20:13 -0200
commit7630b3167210cc7f84c83af54dde23be948e3bc5 (patch)
treeea2d84fc067d6f2ec02f0745bebb93fdf68b6390 /src/core/hle
parentGPU: Do periodic VBlank updates using CoreTiming (diff)
downloadyuzu-7630b3167210cc7f84c83af54dde23be948e3bc5.tar.gz
yuzu-7630b3167210cc7f84c83af54dde23be948e3bc5.tar.xz
yuzu-7630b3167210cc7f84c83af54dde23be948e3bc5.zip
GSP: Fix appending of interrupts to the shared memory buffer
The code was previously appending the interrupt to after the end of the buffer, instead of at the end.
Diffstat (limited to 'src/core/hle')
-rw-r--r--src/core/hle/service/gsp_gpu.cpp4
-rw-r--r--src/core/hle/service/gsp_gpu.h25
2 files changed, 12 insertions, 17 deletions
diff --git a/src/core/hle/service/gsp_gpu.cpp b/src/core/hle/service/gsp_gpu.cpp
index 00a941658..4ca2b9bd0 100644
--- a/src/core/hle/service/gsp_gpu.cpp
+++ b/src/core/hle/service/gsp_gpu.cpp
@@ -210,12 +210,12 @@ void SignalInterrupt(InterruptId interrupt_id) {
210 } 210 }
211 for (int thread_id = 0; thread_id < 0x4; ++thread_id) { 211 for (int thread_id = 0; thread_id < 0x4; ++thread_id) {
212 InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id); 212 InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id);
213 interrupt_relay_queue->number_interrupts = interrupt_relay_queue->number_interrupts + 1;
214
215 u8 next = interrupt_relay_queue->index; 213 u8 next = interrupt_relay_queue->index;
216 next += interrupt_relay_queue->number_interrupts; 214 next += interrupt_relay_queue->number_interrupts;
217 next = next % 0x34; // 0x34 is the number of interrupt slots 215 next = next % 0x34; // 0x34 is the number of interrupt slots
218 216
217 interrupt_relay_queue->number_interrupts += 1;
218
219 interrupt_relay_queue->slot[next] = interrupt_id; 219 interrupt_relay_queue->slot[next] = interrupt_id;
220 interrupt_relay_queue->error_code = 0x0; // No error 220 interrupt_relay_queue->error_code = 0x0; // No error
221 221
diff --git a/src/core/hle/service/gsp_gpu.h b/src/core/hle/service/gsp_gpu.h
index 932b6170f..65abb194a 100644
--- a/src/core/hle/service/gsp_gpu.h
+++ b/src/core/hle/service/gsp_gpu.h
@@ -45,21 +45,16 @@ enum class CommandId : u32 {
45 45
46/// GSP thread interrupt relay queue 46/// GSP thread interrupt relay queue
47struct InterruptRelayQueue { 47struct InterruptRelayQueue {
48 union { 48 // Index of last interrupt in the queue
49 u32 hex; 49 u8 index;
50 50 // Number of interrupts remaining to be processed by the userland code
51 // Index of last interrupt in the queue 51 u8 number_interrupts;
52 BitField<0,8,u32> index; 52 // Error code - zero on success, otherwise an error has occurred
53 53 u8 error_code;
54 // Number of interrupts remaining to be processed by the userland code 54 u8 padding1;
55 BitField<8,8,u32> number_interrupts; 55
56 56 u32 missed_PDC0;
57 // Error code - zero on success, otherwise an error has occurred 57 u32 missed_PDC1;
58 BitField<16,8,u32> error_code;
59 };
60
61 u32 unk0;
62 u32 unk1;
63 58
64 InterruptId slot[0x34]; ///< Interrupt ID slots 59 InterruptId slot[0x34]; ///< Interrupt ID slots
65}; 60};