Просмотр исходного кода

MaxwellDMA: Implement semaphore operations

Lody 4 лет назад
Родитель
Сommit
4498908e72
2 измененных файлов с 21 добавлено и 1 удалено
  1. 19 1
      src/video_core/engines/maxwell_dma.cpp
  2. 2 0
      src/video_core/engines/maxwell_dma.h

+ 19 - 1
src/video_core/engines/maxwell_dma.cpp

@@ -53,7 +53,6 @@ void MaxwellDMA::Launch() {
 
 
     // TODO(Subv): Perform more research and implement all features of this engine.
     // TODO(Subv): Perform more research and implement all features of this engine.
     const LaunchDMA& launch = regs.launch_dma;
     const LaunchDMA& launch = regs.launch_dma;
-    ASSERT(launch.semaphore_type == LaunchDMA::SemaphoreType::NONE);
     ASSERT(launch.interrupt_type == LaunchDMA::InterruptType::NONE);
     ASSERT(launch.interrupt_type == LaunchDMA::InterruptType::NONE);
     ASSERT(launch.data_transfer_type == LaunchDMA::DataTransferType::NON_PIPELINED);
     ASSERT(launch.data_transfer_type == LaunchDMA::DataTransferType::NON_PIPELINED);
     ASSERT(regs.dst_params.origin.x == 0);
     ASSERT(regs.dst_params.origin.x == 0);
@@ -79,6 +78,7 @@ void MaxwellDMA::Launch() {
             CopyPitchToBlockLinear();
             CopyPitchToBlockLinear();
         }
         }
     }
     }
+    ReleaseSemaphore();
 }
 }
 
 
 void MaxwellDMA::CopyPitchToPitch() {
 void MaxwellDMA::CopyPitchToPitch() {
@@ -244,4 +244,22 @@ void MaxwellDMA::FastCopyBlockLinearToPitch() {
     memory_manager.WriteBlock(regs.offset_out, write_buffer.data(), dst_size);
     memory_manager.WriteBlock(regs.offset_out, write_buffer.data(), dst_size);
 }
 }
 
 
+void MaxwellDMA::ReleaseSemaphore() {
+    const auto type = regs.launch_dma.semaphore_type;
+    const GPUVAddr address = regs.semaphore.address;
+    switch (type) {
+    case LaunchDMA::SemaphoreType::NONE:
+        break;
+    case LaunchDMA::SemaphoreType::RELEASE_ONE_WORD_SEMAPHORE:
+        memory_manager.Write<u32>(address, regs.semaphore.payload);
+        break;
+    case LaunchDMA::SemaphoreType::RELEASE_FOUR_WORD_SEMAPHORE:
+        memory_manager.Write<u64>(address, static_cast<u64>(regs.semaphore.payload));
+        memory_manager.Write<u64>(address + 8, system.GPU().GetTicks());
+        break;
+    default:
+        UNREACHABLE_MSG("Unknown semaphore type: {}", static_cast<u32>(type.Value()));
+    }
+}
+
 } // namespace Tegra::Engines
 } // namespace Tegra::Engines

+ 2 - 0
src/video_core/engines/maxwell_dma.h

@@ -224,6 +224,8 @@ private:
 
 
     void FastCopyBlockLinearToPitch();
     void FastCopyBlockLinearToPitch();
 
 
+    void ReleaseSemaphore();
+
     Core::System& system;
     Core::System& system;
 
 
     MemoryManager& memory_manager;
     MemoryManager& memory_manager;