mirror of
https://github.com/yuzu-emu/yuzu-android
synced 2024-12-23 17:31:21 -08:00
NvDec: Fix regressions.
This commit is contained in:
parent
ada09778d9
commit
8d774e7415
@ -55,6 +55,12 @@ u32 SyncpointManager::AllocateSyncpoint(bool clientManaged) {
|
|||||||
return ReserveSyncpoint(FindFreeSyncpoint(), clientManaged);
|
return ReserveSyncpoint(FindFreeSyncpoint(), clientManaged);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void SyncpointManager::FreeSyncpoint(u32 id) {
|
||||||
|
std::lock_guard lock(reservation_lock);
|
||||||
|
ASSERT(syncpoints.at(id).reserved);
|
||||||
|
syncpoints.at(id).reserved = false;
|
||||||
|
}
|
||||||
|
|
||||||
bool SyncpointManager::IsSyncpointAllocated(u32 id) {
|
bool SyncpointManager::IsSyncpointAllocated(u32 id) {
|
||||||
return (id <= SyncpointCount) && syncpoints[id].reserved;
|
return (id <= SyncpointCount) && syncpoints[id].reserved;
|
||||||
}
|
}
|
||||||
|
@ -84,6 +84,11 @@ public:
|
|||||||
*/
|
*/
|
||||||
u32 UpdateMin(u32 id);
|
u32 UpdateMin(u32 id);
|
||||||
|
|
||||||
|
/**
|
||||||
|
* @brief Frees the usage of a syncpoint.
|
||||||
|
*/
|
||||||
|
void FreeSyncpoint(u32 id);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @return A fence that will be signalled once this syncpoint hits its maximum value
|
* @return A fence that will be signalled once this syncpoint hits its maximum value
|
||||||
*/
|
*/
|
||||||
|
@ -43,6 +43,7 @@ nvhost_gpu::~nvhost_gpu() {
|
|||||||
events_interface.FreeEvent(sm_exception_breakpoint_int_report_event);
|
events_interface.FreeEvent(sm_exception_breakpoint_int_report_event);
|
||||||
events_interface.FreeEvent(sm_exception_breakpoint_pause_report_event);
|
events_interface.FreeEvent(sm_exception_breakpoint_pause_report_event);
|
||||||
events_interface.FreeEvent(error_notifier_event);
|
events_interface.FreeEvent(error_notifier_event);
|
||||||
|
syncpoint_manager.FreeSyncpoint(channel_syncpoint);
|
||||||
}
|
}
|
||||||
|
|
||||||
NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input,
|
NvResult nvhost_gpu::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input,
|
||||||
|
@ -51,8 +51,12 @@ std::unordered_map<DeviceFD, u32> nvhost_nvdec_common::fd_to_id{};
|
|||||||
nvhost_nvdec_common::nvhost_nvdec_common(Core::System& system_, NvCore::Container& core_,
|
nvhost_nvdec_common::nvhost_nvdec_common(Core::System& system_, NvCore::Container& core_,
|
||||||
NvCore::ChannelType channel_type_)
|
NvCore::ChannelType channel_type_)
|
||||||
: nvdevice{system_}, core{core_}, syncpoint_manager{core.GetSyncpointManager()},
|
: nvdevice{system_}, core{core_}, syncpoint_manager{core.GetSyncpointManager()},
|
||||||
nvmap{core.GetNvMapFile()}, channel_type{channel_type_} {}
|
nvmap{core.GetNvMapFile()}, channel_type{channel_type_} {
|
||||||
nvhost_nvdec_common::~nvhost_nvdec_common() = default;
|
channel_syncpoint = syncpoint_manager.AllocateSyncpoint(false);
|
||||||
|
}
|
||||||
|
nvhost_nvdec_common::~nvhost_nvdec_common() {
|
||||||
|
syncpoint_manager.FreeSyncpoint(channel_syncpoint);
|
||||||
|
}
|
||||||
|
|
||||||
NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) {
|
NvResult nvhost_nvdec_common::SetNVMAPfd(const std::vector<u8>& input) {
|
||||||
IoctlSetNvmapFD params{};
|
IoctlSetNvmapFD params{};
|
||||||
@ -117,8 +121,8 @@ NvResult nvhost_nvdec_common::GetSyncpoint(const std::vector<u8>& input, std::ve
|
|||||||
std::memcpy(¶ms, input.data(), sizeof(IoctlGetSyncpoint));
|
std::memcpy(¶ms, input.data(), sizeof(IoctlGetSyncpoint));
|
||||||
LOG_DEBUG(Service_NVDRV, "called GetSyncpoint, id={}", params.param);
|
LOG_DEBUG(Service_NVDRV, "called GetSyncpoint, id={}", params.param);
|
||||||
|
|
||||||
const u32 id{NvCore::SyncpointManager::channel_syncpoints[static_cast<u32>(channel_type)]};
|
// const u32 id{NvCore::SyncpointManager::channel_syncpoints[static_cast<u32>(channel_type)]};
|
||||||
params.value = id;
|
params.value = channel_syncpoint;
|
||||||
std::memcpy(output.data(), ¶ms, sizeof(IoctlGetSyncpoint));
|
std::memcpy(output.data(), ¶ms, sizeof(IoctlGetSyncpoint));
|
||||||
|
|
||||||
return NvResult::Success;
|
return NvResult::Success;
|
||||||
@ -176,4 +180,8 @@ Kernel::KEvent* nvhost_nvdec_common::QueryEvent(u32 event_id) {
|
|||||||
return nullptr;
|
return nullptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void nvhost_nvdec_common::Reset() {
|
||||||
|
fd_to_id.clear();
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Service::Nvidia::Devices
|
} // namespace Service::Nvidia::Devices
|
||||||
|
@ -24,6 +24,8 @@ public:
|
|||||||
NvCore::ChannelType channel_type);
|
NvCore::ChannelType channel_type);
|
||||||
~nvhost_nvdec_common() override;
|
~nvhost_nvdec_common() override;
|
||||||
|
|
||||||
|
static void Reset();
|
||||||
|
|
||||||
protected:
|
protected:
|
||||||
struct IoctlSetNvmapFD {
|
struct IoctlSetNvmapFD {
|
||||||
s32_le nvmap_fd{};
|
s32_le nvmap_fd{};
|
||||||
@ -117,6 +119,7 @@ protected:
|
|||||||
Kernel::KEvent* QueryEvent(u32 event_id) override;
|
Kernel::KEvent* QueryEvent(u32 event_id) override;
|
||||||
|
|
||||||
static std::unordered_map<DeviceFD, u32> fd_to_id;
|
static std::unordered_map<DeviceFD, u32> fd_to_id;
|
||||||
|
u32 channel_syncpoint;
|
||||||
s32_le nvmap_fd{};
|
s32_le nvmap_fd{};
|
||||||
u32_le submit_timeout{};
|
u32_le submit_timeout{};
|
||||||
NvCore::Container& core;
|
NvCore::Container& core;
|
||||||
|
@ -18,6 +18,7 @@
|
|||||||
#include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h"
|
#include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvhost_gpu.h"
|
#include "core/hle/service/nvdrv/devices/nvhost_gpu.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvhost_nvdec.h"
|
#include "core/hle/service/nvdrv/devices/nvhost_nvdec.h"
|
||||||
|
#include "core/hle/service/nvdrv/devices/nvhost_nvdec_common.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvhost_nvjpg.h"
|
#include "core/hle/service/nvdrv/devices/nvhost_nvjpg.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvhost_vic.h"
|
#include "core/hle/service/nvdrv/devices/nvhost_vic.h"
|
||||||
#include "core/hle/service/nvdrv/devices/nvmap.h"
|
#include "core/hle/service/nvdrv/devices/nvmap.h"
|
||||||
@ -101,7 +102,9 @@ Module::Module(Core::System& system)
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
Module::~Module() = default;
|
Module::~Module() {
|
||||||
|
Devices::nvhost_nvdec_common::Reset();
|
||||||
|
}
|
||||||
|
|
||||||
NvResult Module::VerifyFD(DeviceFD fd) const {
|
NvResult Module::VerifyFD(DeviceFD fd) const {
|
||||||
if (fd < 0) {
|
if (fd < 0) {
|
||||||
|
Loading…
Reference in New Issue
Block a user