Sfoglia il codice sorgente

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.
Yuri Kunde Schlesner 11 anni fa
parent
commit
7630b31672
2 ha cambiato i file con 12 aggiunte e 17 eliminazioni
  1. 2 2
      src/core/hle/service/gsp_gpu.cpp
  2. 10 15
      src/core/hle/service/gsp_gpu.h

+ 2 - 2
src/core/hle/service/gsp_gpu.cpp

@@ -210,12 +210,12 @@ void SignalInterrupt(InterruptId interrupt_id) {
     }
     for (int thread_id = 0; thread_id < 0x4; ++thread_id) {
         InterruptRelayQueue* interrupt_relay_queue = GetInterruptRelayQueue(thread_id);
-        interrupt_relay_queue->number_interrupts = interrupt_relay_queue->number_interrupts + 1;
-
         u8 next = interrupt_relay_queue->index;
         next += interrupt_relay_queue->number_interrupts;
         next = next % 0x34; // 0x34 is the number of interrupt slots
 
+        interrupt_relay_queue->number_interrupts += 1;
+
         interrupt_relay_queue->slot[next] = interrupt_id;
         interrupt_relay_queue->error_code = 0x0; // No error
 

+ 10 - 15
src/core/hle/service/gsp_gpu.h

@@ -45,21 +45,16 @@ enum class CommandId : u32 {
 
 /// GSP thread interrupt relay queue
 struct InterruptRelayQueue {
-    union {
-        u32 hex;
-
-        // Index of last interrupt in the queue
-        BitField<0,8,u32>   index;
-
-        // Number of interrupts remaining to be processed by the userland code
-        BitField<8,8,u32>   number_interrupts;
-
-        // Error code - zero on success, otherwise an error has occurred
-        BitField<16,8,u32>  error_code;
-    };
-
-    u32 unk0;
-    u32 unk1;
+    // Index of last interrupt in the queue
+    u8 index;
+    // Number of interrupts remaining to be processed by the userland code
+    u8 number_interrupts;
+    // Error code - zero on success, otherwise an error has occurred
+    u8 error_code;
+    u8 padding1;
+
+    u32 missed_PDC0;
+    u32 missed_PDC1;
 
     InterruptId slot[0x34];   ///< Interrupt ID slots
 };