Browse Source

Merge pull request #6237 from ameerj/nvdec-end-fix

nvhost_vic: Fix device closure
bunnei 5 years ago
parent
commit
3c5fb53634

+ 3 - 3
src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp

@@ -31,9 +31,8 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>&
             return SetSubmitTimeout(input, output);
             return SetSubmitTimeout(input, output);
         case 0x9:
         case 0x9:
             return MapBuffer(input, output);
             return MapBuffer(input, output);
-        case 0xa: {
+        case 0xa:
             return UnmapBuffer(input, output);
             return UnmapBuffer(input, output);
-        }
         default:
         default:
             break;
             break;
         }
         }
@@ -67,7 +66,8 @@ NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>&
 void nvhost_nvdec::OnOpen(DeviceFD fd) {}
 void nvhost_nvdec::OnOpen(DeviceFD fd) {}
 
 
 void nvhost_nvdec::OnClose(DeviceFD fd) {
 void nvhost_nvdec::OnClose(DeviceFD fd) {
-    system.GPU().ClearCommandBuffer();
+    LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
+    system.GPU().ClearCdmaInstance();
 }
 }
 
 
 } // namespace Service::Nvidia::Devices
 } // namespace Service::Nvidia::Devices

+ 5 - 7
src/core/hle/service/nvdrv/devices/nvhost_vic.cpp

@@ -29,13 +29,8 @@ NvResult nvhost_vic::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& i
             return GetWaitbase(input, output);
             return GetWaitbase(input, output);
         case 0x9:
         case 0x9:
             return MapBuffer(input, output);
             return MapBuffer(input, output);
-        case 0xa: {
-            if (command.length == 0x1c) {
-                Tegra::ChCommandHeaderList cmdlist{{0xDEADB33F}};
-                system.GPU().PushCommandBuffer(cmdlist);
-            }
+        case 0xa:
             return UnmapBuffer(input, output);
             return UnmapBuffer(input, output);
-        }
         default:
         default:
             break;
             break;
         }
         }
@@ -69,6 +64,9 @@ NvResult nvhost_vic::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& i
 }
 }
 
 
 void nvhost_vic::OnOpen(DeviceFD fd) {}
 void nvhost_vic::OnOpen(DeviceFD fd) {}
-void nvhost_vic::OnClose(DeviceFD fd) {}
+
+void nvhost_vic::OnClose(DeviceFD fd) {
+    system.GPU().ClearCdmaInstance();
+}
 
 
 } // namespace Service::Nvidia::Devices
 } // namespace Service::Nvidia::Devices

+ 1 - 3
src/video_core/gpu.cpp

@@ -492,10 +492,8 @@ void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
     cdma_pusher->ProcessEntries(std::move(entries));
     cdma_pusher->ProcessEntries(std::move(entries));
 }
 }
 
 
-void GPU::ClearCommandBuffer() {
-    // This condition fires when a video stream ends, clear all intermediary data
+void GPU::ClearCdmaInstance() {
     cdma_pusher.reset();
     cdma_pusher.reset();
-    LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
 }
 }
 
 
 void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
 void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {

+ 2 - 2
src/video_core/gpu.h

@@ -324,8 +324,8 @@ public:
     /// Push GPU command buffer entries to be processed
     /// Push GPU command buffer entries to be processed
     void PushCommandBuffer(Tegra::ChCommandHeaderList& entries);
     void PushCommandBuffer(Tegra::ChCommandHeaderList& entries);
 
 
-    /// Frees the CDMAPusher to free up resources
-    void ClearCommandBuffer();
+    /// Frees the CDMAPusher instance to free up resources
+    void ClearCdmaInstance();
 
 
     /// Swap buffers (render frame)
     /// Swap buffers (render frame)
     void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);
     void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);