diff options
author | Fernando Sahmkow <fsahmkow27@gmail.com> | 2019-06-08 00:41:55 +0200 |
---|---|---|
committer | FernandoS27 <fsahmkow27@gmail.com> | 2019-07-05 21:49:13 +0200 |
commit | e0027eba854b9cf097360e898457e164e6ae0b4d (patch) | |
tree | 3dfffe7615e1371aae0d31c98982608a62171701 /src/core/hle/service/nvdrv/nvdrv.cpp | |
parent | nv_services: Create GPU channels correctly (diff) | |
download | yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar.gz yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar.bz2 yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar.lz yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar.xz yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.tar.zst yuzu-e0027eba854b9cf097360e898457e164e6ae0b4d.zip |
Diffstat (limited to 'src/core/hle/service/nvdrv/nvdrv.cpp')
-rw-r--r-- | src/core/hle/service/nvdrv/nvdrv.cpp | 26 |
1 files changed, 25 insertions, 1 deletions
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 6e4b8f2c6..618bcbc7c 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp @@ -4,7 +4,10 @@ #include <utility> +#include <fmt/format.h> #include "core/hle/ipc_helpers.h" +#include "core/hle/kernel/readable_event.h" +#include "core/hle/kernel/writable_event.h" #include "core/hle/service/nvdrv/devices/nvdevice.h" #include "core/hle/service/nvdrv/devices/nvdisp_disp0.h" #include "core/hle/service/nvdrv/devices/nvhost_as_gpu.h" @@ -33,13 +36,21 @@ void InstallInterfaces(SM::ServiceManager& service_manager, NVFlinger::NVFlinger } Module::Module() { + auto& kernel = Core::System::GetInstance().Kernel(); + for (u32 i = 0; i < MaxNvEvents; i++) { + std::string event_label = fmt::format("NVDRV::NvEvent_{}", i); + events_interface.events[i] = Kernel::WritableEvent::CreateEventPair( + kernel, Kernel::ResetType::Automatic, event_label); + events_interface.status[i] = EventState::Free; + events_interface.registered[i] = false; + } auto nvmap_dev = std::make_shared<Devices::nvmap>(); devices["/dev/nvhost-as-gpu"] = std::make_shared<Devices::nvhost_as_gpu>(nvmap_dev); devices["/dev/nvhost-gpu"] = std::make_shared<Devices::nvhost_gpu>(nvmap_dev); devices["/dev/nvhost-ctrl-gpu"] = std::make_shared<Devices::nvhost_ctrl_gpu>(); devices["/dev/nvmap"] = nvmap_dev; devices["/dev/nvdisp_disp0"] = std::make_shared<Devices::nvdisp_disp0>(nvmap_dev); - devices["/dev/nvhost-ctrl"] = std::make_shared<Devices::nvhost_ctrl>(); + devices["/dev/nvhost-ctrl"] = std::make_shared<Devices::nvhost_ctrl>(events_interface); devices["/dev/nvhost-nvdec"] = std::make_shared<Devices::nvhost_nvdec>(); devices["/dev/nvhost-nvjpg"] = std::make_shared<Devices::nvhost_nvjpg>(); devices["/dev/nvhost-vic"] = std::make_shared<Devices::nvhost_vic>(); @@ -77,4 +88,17 @@ ResultCode Module::Close(u32 fd) { return RESULT_SUCCESS; } +void Module::SignalEvent(const u32 event_id) { + if (event_id >= 64) { + LOG_ERROR(Service_NVDRV, "Unexpected Event signalled!"); + return; + } + events_interface.LiberateEvent(event_id); + events_interface.events[event_id].writable->Signal(); +} + +Kernel::SharedPtr<Kernel::ReadableEvent> Module::GetEvent(const u32 event_id) { + return events_interface.events[event_id].readable; +} + } // namespace Service::Nvidia |