mirror of
https://github.com/yuzu-mirror/yuzu.git
synced 2024-11-18 02:49:57 +00:00
Merge pull request #6125 from ogniK5377/nvdec-close-dev
nvdrv: Cleanup CDMA Processor on device closure
This commit is contained in:
commit
9ad77ba6d3
3 changed files with 14 additions and 11 deletions
|
@ -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
|
||||
|
|
|
@ -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,12 @@ 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
|
||||
cdma_pusher.reset();
|
||||
LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
|
||||
}
|
||||
|
||||
void GPU::SwapBuffers(const Tegra::FramebufferConfig* framebuffer) {
|
||||
gpu_thread.SwapBuffers(framebuffer);
|
||||
}
|
||||
|
|
|
@ -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);
|
||||
|
||||
|
|
Loading…
Reference in a new issue