From 94a4ece912cd90bf1a7ed0936f757d36b90cba06 Mon Sep 17 00:00:00 2001 From: pineappleEA Date: Sat, 17 Apr 2021 09:23:19 +0200 Subject: [PATCH] early-access version 1609 --- README.md | 2 +- .../hle/service/nvdrv/devices/nvhost_nvdec.cpp | 15 ++++++--------- src/video_core/gpu.cpp | 12 +++++++----- src/video_core/gpu.h | 3 +++ 4 files changed, 17 insertions(+), 15 deletions(-) diff --git a/README.md b/README.md index 11cb3a8e2..776957c7b 100755 --- a/README.md +++ b/README.md @@ -1,7 +1,7 @@ yuzu emulator early access ============= -This is the source code for early-access 1608. +This is the source code for early-access 1609. ## Legal Notice diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index b9d30927a..8b37f7a3f 100755 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp @@ -31,15 +31,8 @@ NvResult nvhost_nvdec::Ioctl1(DeviceFD fd, Ioctl command, const std::vector& return SetSubmitTimeout(input, output); 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); - system.GPU().MemoryManager().InvalidateQueuedCaches(); - } + case 0xa: return UnmapBuffer(input, output); - } default: break; } @@ -71,6 +64,10 @@ NvResult nvhost_nvdec::Ioctl3(DeviceFD fd, Ioctl command, const std::vector& } 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 diff --git a/src/video_core/gpu.cpp b/src/video_core/gpu.cpp index 9bdb282d2..7c42f1177 100755 --- 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(*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); } diff --git a/src/video_core/gpu.h b/src/video_core/gpu.h index ecab35d3b..b1960ea86 100755 --- 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);