summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorChloe Marcec <dmarcecguzman@gmail.com>2021-03-30 11:37:40 +0200
committerChloe Marcec <dmarcecguzman@gmail.com>2021-03-30 11:37:40 +0200
commitbf1c1788cab4740d8c46c30ad8a97021b2e858f9 (patch)
tree3d3228a9369adcfe1db58c698b4ba84e86376300
parentMerge pull request #6109 from german77/gestureID (diff)
downloadyuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar.gz
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar.bz2
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar.lz
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar.xz
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.tar.zst
yuzu-bf1c1788cab4740d8c46c30ad8a97021b2e858f9.zip
-rw-r--r--src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp10
-rw-r--r--src/video_core/gpu.cpp13
-rw-r--r--src/video_core/gpu.h3
3 files changed, 15 insertions, 11 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
index c8031970b..4e58b9b80 100644
--- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
+++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp
@@ -32,11 +32,6 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>&
case 0x9:
return MapBuffer(input, output);
case 0xa: {
- if (command.length == 0x1c) {
- LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
- Tegra::ChCommandHeaderList cmdlist{{0xDEADB33F}};
- system.GPU().PushCommandBuffer(cmdlist);
- }
return UnmapBuffer(input, output);
}
default:
@@ -70,6 +65,9 @@ NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>&
}
void nvhost_nvdec::OnOpen(DeviceFD fd) {}
-void nvhost_nvdec::OnClose(DeviceFD fd) {}
+
+void nvhost_nvdec::OnClose(DeviceFD fd) {
+ system.GPU().ClearCommandBuffer();
+}
} // namespace Service::Nvidia::Devices
diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp
index c61f44619..811e248a3 100644
--- a/src/video_core/gpu.cpp
+++ b/src/video_core/gpu.cpp
@@ -480,11 +480,7 @@ void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
if (!use_nvdec) {
return;
}
- // This condition fires when a video stream ends, clear all intermediary data
- if (entries[0].raw == 0xDEADB33F) {
- cdma_pusher.reset();
- return;
- }
+
if (!cdma_pusher) {
cdma_pusher = std::make_unique<Tegra::CDmaPusher>(*this);
}
@@ -496,6 +492,13 @@ void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
cdma_pusher->ProcessEntries(std::move(entries));
}
+void GPU::ClearCommandBuffer() {
+ // This condition fires when a video stream ends, clear all intermediary data
+ if (cdma_pusher) {
+ cdma_pusher.reset();
+ }
+}
+
void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
gpu_thread.SwapBuffers(framebuffer);
}
diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h
index b2ee45496..d40982a54 100644
--- a/src/video_core/gpu.h
+++ b/src/video_core/gpu.h
@@ -324,6 +324,9 @@ public:
/// Push GPU command buffer entries to be processed
void PushCommandBuffer(Tegra::ChCommandHeaderList& entries);
+ /// Frees the CDMAPusher to free up resources
+ void ClearCommandBuffer();
+
/// Swap buffers (render frame)
void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);