2
1
Fork 0
mirror of https://github.com/yuzu-emu/yuzu.git synced 2024-07-04 23:31:19 +01:00

nvhost_vic: Fix device closure

Implements the OnClose method of the nvhost_vic device, and removes the remnants of an older implementation.

Also cleans up some of the surrounding code.
This commit is contained in:
ameerj 2021-04-24 19:22:09 -04:00
parent 4c8c5ad1b6
commit 75e0d16caa
4 changed files with 11 additions and 15 deletions

View file

@ -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

View file

@ -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: { case 0xa:
if (command.length == 0x1c) {
Tegra::ChCommandHeaderList cmdlist{{0xDEADB33F}};
system.GPU().PushCommandBuffer(cmdlist);
}
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

View file

@ -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() { void GPU::ClearCdmaInstance() {
// This condition fires when a video stream ends, clear all intermediary data
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) {

View file

@ -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 /// Frees the CDMAPusher instance to free up resources
void ClearCommandBuffer(); void ClearCdmaInstance();
/// Swap buffers (render frame) /// Swap buffers (render frame)
void SwapBuffers(const Tegra::FramebufferConfig* framebuffer); void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);