early-access version 1609

main
pineappleEA 2021-04-17 09:23:19 +02:00
parent df11e394f2
commit 94a4ece912
4 changed files with 17 additions and 15 deletions

View File

@ -1,7 +1,7 @@
yuzu emulator early access yuzu emulator early access
============= =============
This is the source code for early-access 1608. This is the source code for early-access 1609.
## Legal Notice ## Legal Notice

View File

@ -31,15 +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:
if (command.length == 0x1c) {
LOG_INFO(Service_NVDRV, "NVDEC video stream ended");
Tegra::ChCommandHeaderList cmdlist{{0xDEADB33F}};
system.GPU().PushCommandBuffer(cmdlist);
system.GPU().MemoryManager().InvalidateQueuedCaches();
}
return UnmapBuffer(input, output); return UnmapBuffer(input, output);
}
default: default:
break; break;
} }
@ -71,6 +64,10 @@ 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();
system.GPU().MemoryManager().InvalidateQueuedCaches();
}
} // namespace Service::Nvidia::Devices } // namespace Service::Nvidia::Devices

View File

@ -480,11 +480,7 @@ void GPU::PushCommandBuffer(Tegra::ChCommandHeaderList& entries) {
if (!use_nvdec) { if (!use_nvdec) {
return; 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) { if (!cdma_pusher) {
cdma_pusher = std::make_unique<Tegra::CDmaPusher>(*this); cdma_pusher = std::make_unique<Tegra::CDmaPusher>(*this);
} }
@ -496,6 +492,12 @@ 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
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) {
gpu_thread.SwapBuffers(framebuffer); gpu_thread.SwapBuffers(framebuffer);
} }

View File

@ -324,6 +324,9 @@ 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();
/// Swap buffers (render frame) /// Swap buffers (render frame)
void SwapBuffers(const Tegra::FramebufferConfig* framebuffer); void SwapBuffers(const Tegra::FramebufferConfig* framebuffer);