diff options
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h | 3 |
2 files changed, 11 insertions, 2 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp index fe83423d5..2ec1ad3e9 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.cpp | |||
| @@ -47,15 +47,21 @@ std::size_t WriteVectors(std::vector<u8>& dst, const std::vector<T>& src, std::s | |||
| 47 | } // Anonymous namespace | 47 | } // Anonymous namespace |
| 48 | 48 | ||
| 49 | std::unordered_map<DeviceFD, u32> nvhost_nvdec_common::fd_to_id{}; | 49 | std::unordered_map<DeviceFD, u32> nvhost_nvdec_common::fd_to_id{}; |
| 50 | std::deque<u32> nvhost_nvdec_common::syncpts_accumulated{}; | ||
| 50 | 51 | ||
| 51 | nvhost_nvdec_common::nvhost_nvdec_common(Core::System& system_, NvCore::Container& core_, | 52 | nvhost_nvdec_common::nvhost_nvdec_common(Core::System& system_, NvCore::Container& core_, |
| 52 | NvCore::ChannelType channel_type_) | 53 | NvCore::ChannelType channel_type_) |
| 53 | : nvdevice{system_}, core{core_}, syncpoint_manager{core.GetSyncpointManager()}, | 54 | : nvdevice{system_}, core{core_}, syncpoint_manager{core.GetSyncpointManager()}, |
| 54 | nvmap{core.GetNvMapFile()}, channel_type{channel_type_} { | 55 | nvmap{core.GetNvMapFile()}, channel_type{channel_type_} { |
| 55 | channel_syncpoint = syncpoint_manager.AllocateSyncpoint(false); | 56 | if (syncpts_accumulated.empty()) { |
| 57 | channel_syncpoint = syncpoint_manager.AllocateSyncpoint(false); | ||
| 58 | } else { | ||
| 59 | channel_syncpoint = syncpts_accumulated.front(); | ||
| 60 | syncpts_accumulated.pop_front(); | ||
| 61 | } | ||
| 56 | } | 62 | } |
| 57 | nvhost_nvdec_common::~nvhost_nvdec_common() { | 63 | nvhost_nvdec_common::~nvhost_nvdec_common() { |
| 58 | syncpoint_manager.FreeSyncpoint(channel_syncpoint); | 64 | syncpts_accumulated.push_back(channel_syncpoint); |
| 59 | } | 65 | } |
| 60 | 66 | ||
| 61 | NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) { | 67 | NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h index 4046b0e13..93990bb9b 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec_common.h | |||
| @@ -3,6 +3,7 @@ | |||
| 3 | 3 | ||
| 4 | #pragma once | 4 | #pragma once |
| 5 | 5 | ||
| 6 | #include <deque> | ||
| 6 | #include <vector> | 7 | #include <vector> |
| 7 | #include "common/common_types.h" | 8 | #include "common/common_types.h" |
| 8 | #include "common/swap.h" | 9 | #include "common/swap.h" |
| @@ -127,6 +128,8 @@ protected: | |||
| 127 | NvCore::NvMap& nvmap; | 128 | NvCore::NvMap& nvmap; |
| 128 | NvCore::ChannelType channel_type; | 129 | NvCore::ChannelType channel_type; |
| 129 | std::array<u32, MaxSyncPoints> device_syncpoints{}; | 130 | std::array<u32, MaxSyncPoints> device_syncpoints{}; |
| 131 | |||
| 132 | static std::deque<u32> syncpts_accumulated; | ||
| 130 | }; | 133 | }; |
| 131 | }; // namespace Devices | 134 | }; // namespace Devices |
| 132 | } // namespace Service::Nvidia | 135 | } // namespace Service::Nvidia |