summaryrefslogtreecommitdiffstats
path: root/src/core/hle/service/nvdrv/nvdrv.cpp
diff options
context:
space:
mode:
authorFernando Sahmkow <fsahmkow27@gmail.com>2019-06-08 00:41:55 +0200
committerFernandoS27 <fsahmkow27@gmail.com>2019-07-05 21:49:13 +0200
commite0027eba854b9cf097360e898457e164e6ae0b4d (patch)
tree3dfffe7615e1371aae0d31c98982608a62171701 /src/core/hle/service/nvdrv/nvdrv.cpp
parentnv_services: Create GPU channels correctly (diff)
downloadyuzu-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 '')
-rw-r--r--src/core/hle/service/nvdrv/nvdrv.cpp26
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