diff options
| author | 2020-12-11 16:04:46 -0800 | |
|---|---|---|
| committer | 2020-12-28 16:33:48 -0800 | |
| commit | 0c81b83ca9bd773b4a769820459c6a4a01435f89 (patch) | |
| tree | bb77d33d7db1898b58feb0d7304fc7c723bb5222 | |
| parent | hle: kernel: service_thread: Add parameter for thread pool size. (diff) | |
| download | yuzu-0c81b83ca9bd773b4a769820459c6a4a01435f89.tar.gz yuzu-0c81b83ca9bd773b4a769820459c6a4a01435f89.tar.xz yuzu-0c81b83ca9bd773b4a769820459c6a4a01435f89.zip | |
hle: service: nvdrv: Revert #4981 to remove usage of SleepClientThread.
- Note, this always processes the ioctl right away, which fixes BotW 1.0.0 issues.
23 files changed, 83 insertions, 211 deletions
diff --git a/src/core/hle/service/nvdrv/devices/nvdevice.h b/src/core/hle/service/nvdrv/devices/nvdevice.h index 44a8bc060..5681599ba 100644 --- a/src/core/hle/service/nvdrv/devices/nvdevice.h +++ b/src/core/hle/service/nvdrv/devices/nvdevice.h | |||
| @@ -31,8 +31,8 @@ public: | |||
| 31 | * @param output A buffer where the output data will be written to. | 31 | * @param output A buffer where the output data will be written to. |
| 32 | * @returns The result code of the ioctl. | 32 | * @returns The result code of the ioctl. |
| 33 | */ | 33 | */ |
| 34 | virtual NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 34 | virtual NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 35 | IoctlCtrl& ctrl) = 0; | 35 | std::vector<u8>& output) = 0; |
| 36 | 36 | ||
| 37 | /** | 37 | /** |
| 38 | * Handles an ioctl2 request. | 38 | * Handles an ioctl2 request. |
| @@ -43,8 +43,7 @@ public: | |||
| 43 | * @returns The result code of the ioctl. | 43 | * @returns The result code of the ioctl. |
| 44 | */ | 44 | */ |
| 45 | virtual NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 45 | virtual NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 46 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 46 | const std::vector<u8>& inline_input, std::vector<u8>& output) = 0; |
| 47 | IoctlCtrl& ctrl) = 0; | ||
| 48 | 47 | ||
| 49 | /** | 48 | /** |
| 50 | * Handles an ioctl3 request. | 49 | * Handles an ioctl3 request. |
| @@ -55,7 +54,7 @@ public: | |||
| 55 | * @returns The result code of the ioctl. | 54 | * @returns The result code of the ioctl. |
| 56 | */ | 55 | */ |
| 57 | virtual NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 56 | virtual NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 58 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) = 0; | 57 | std::vector<u8>& inline_output) = 0; |
| 59 | 58 | ||
| 60 | protected: | 59 | protected: |
| 61 | Core::System& system; | 60 | Core::System& system; |
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp index 170a7c9a0..ce615c758 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.cpp | |||
| @@ -18,21 +18,20 @@ nvdisp_disp0::nvdisp_disp0(Core::System& system, std::shared_ptr<nvmap> nvmap_de | |||
| 18 | : nvdevice(system), nvmap_dev(std::move(nvmap_dev)) {} | 18 | : nvdevice(system), nvmap_dev(std::move(nvmap_dev)) {} |
| 19 | nvdisp_disp0 ::~nvdisp_disp0() = default; | 19 | nvdisp_disp0 ::~nvdisp_disp0() = default; |
| 20 | 20 | ||
| 21 | NvResult nvdisp_disp0::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 21 | NvResult nvdisp_disp0::Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 22 | IoctlCtrl& ctrl) { | 22 | std::vector<u8>& output) { |
| 23 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 23 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 24 | return NvResult::NotImplemented; | 24 | return NvResult::NotImplemented; |
| 25 | } | 25 | } |
| 26 | 26 | ||
| 27 | NvResult nvdisp_disp0::Ioctl2(Ioctl command, const std::vector<u8>& input, | 27 | NvResult nvdisp_disp0::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 28 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 28 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 29 | IoctlCtrl& ctrl) { | ||
| 30 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 29 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 31 | return NvResult::NotImplemented; | 30 | return NvResult::NotImplemented; |
| 32 | } | 31 | } |
| 33 | 32 | ||
| 34 | NvResult nvdisp_disp0::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 33 | NvResult nvdisp_disp0::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 35 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 34 | std::vector<u8>& inline_output) { |
| 36 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 35 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 37 | return NvResult::NotImplemented; | 36 | return NvResult::NotImplemented; |
| 38 | } | 37 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h index eb7575e40..55a33b7e4 100644 --- a/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h +++ b/src/core/hle/service/nvdrv/devices/nvdisp_disp0.h | |||
| @@ -20,13 +20,11 @@ public: | |||
| 20 | explicit nvdisp_disp0(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); | 20 | explicit nvdisp_disp0(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); |
| 21 | ~nvdisp_disp0() override; | 21 | ~nvdisp_disp0() override; |
| 22 | 22 | ||
| 23 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 23 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 24 | IoctlCtrl& ctrl) override; | ||
| 25 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 24 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 26 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 25 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 27 | IoctlCtrl& ctrl) override; | ||
| 28 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 26 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 29 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 27 | std::vector<u8>& inline_output) override; |
| 30 | 28 | ||
| 31 | /// Performs a screen flip, drawing the buffer pointed to by the handle. | 29 | /// Performs a screen flip, drawing the buffer pointed to by the handle. |
| 32 | void flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height, u32 stride, | 30 | void flip(u32 buffer_handle, u32 offset, u32 format, u32 width, u32 height, u32 stride, |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp index 4e0652c39..6b062e10e 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.cpp | |||
| @@ -21,8 +21,8 @@ nvhost_as_gpu::nvhost_as_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_ | |||
| 21 | : nvdevice(system), nvmap_dev(std::move(nvmap_dev)) {} | 21 | : nvdevice(system), nvmap_dev(std::move(nvmap_dev)) {} |
| 22 | nvhost_as_gpu::~nvhost_as_gpu() = default; | 22 | nvhost_as_gpu::~nvhost_as_gpu() = default; |
| 23 | 23 | ||
| 24 | NvResult nvhost_as_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 24 | NvResult nvhost_as_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 25 | IoctlCtrl& ctrl) { | 25 | std::vector<u8>& output) { |
| 26 | switch (command.group) { | 26 | switch (command.group) { |
| 27 | case 'A': | 27 | case 'A': |
| 28 | switch (command.cmd) { | 28 | switch (command.cmd) { |
| @@ -55,14 +55,13 @@ NvResult nvhost_as_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, std: | |||
| 55 | } | 55 | } |
| 56 | 56 | ||
| 57 | NvResult nvhost_as_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, | 57 | NvResult nvhost_as_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 58 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 58 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 59 | IoctlCtrl& ctrl) { | ||
| 60 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 59 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 61 | return NvResult::NotImplemented; | 60 | return NvResult::NotImplemented; |
| 62 | } | 61 | } |
| 63 | 62 | ||
| 64 | NvResult nvhost_as_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 63 | NvResult nvhost_as_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 65 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 64 | std::vector<u8>& inline_output) { |
| 66 | switch (command.group) { | 65 | switch (command.group) { |
| 67 | case 'A': | 66 | case 'A': |
| 68 | switch (command.cmd) { | 67 | switch (command.cmd) { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h index 2bd355af9..08035fa0e 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_as_gpu.h | |||
| @@ -30,13 +30,11 @@ public: | |||
| 30 | explicit nvhost_as_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); | 30 | explicit nvhost_as_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); |
| 31 | ~nvhost_as_gpu() override; | 31 | ~nvhost_as_gpu() override; |
| 32 | 32 | ||
| 33 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 33 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 34 | IoctlCtrl& ctrl) override; | ||
| 35 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 34 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 36 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 35 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 37 | IoctlCtrl& ctrl) override; | ||
| 38 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 36 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 39 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 37 | std::vector<u8>& inline_output) override; |
| 40 | 38 | ||
| 41 | private: | 39 | private: |
| 42 | class BufferMap final { | 40 | class BufferMap final { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp index 92d31b620..fea3b7b9f 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.cpp | |||
| @@ -20,8 +20,7 @@ nvhost_ctrl::nvhost_ctrl(Core::System& system, EventInterface& events_interface, | |||
| 20 | : nvdevice(system), events_interface{events_interface}, syncpoint_manager{syncpoint_manager} {} | 20 | : nvdevice(system), events_interface{events_interface}, syncpoint_manager{syncpoint_manager} {} |
| 21 | nvhost_ctrl::~nvhost_ctrl() = default; | 21 | nvhost_ctrl::~nvhost_ctrl() = default; |
| 22 | 22 | ||
| 23 | NvResult nvhost_ctrl::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 23 | NvResult nvhost_ctrl::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
| 24 | IoctlCtrl& ctrl) { | ||
| 25 | switch (command.group) { | 24 | switch (command.group) { |
| 26 | case 0x0: | 25 | case 0x0: |
| 27 | switch (command.cmd) { | 26 | switch (command.cmd) { |
| @@ -30,9 +29,9 @@ NvResult nvhost_ctrl::Ioctl1(Ioctl command, const std::vector<u8>& input, std::v | |||
| 30 | case 0x1c: | 29 | case 0x1c: |
| 31 | return IocCtrlClearEventWait(input, output); | 30 | return IocCtrlClearEventWait(input, output); |
| 32 | case 0x1d: | 31 | case 0x1d: |
| 33 | return IocCtrlEventWait(input, output, false, ctrl); | 32 | return IocCtrlEventWait(input, output, false); |
| 34 | case 0x1e: | 33 | case 0x1e: |
| 35 | return IocCtrlEventWait(input, output, true, ctrl); | 34 | return IocCtrlEventWait(input, output, true); |
| 36 | case 0x1f: | 35 | case 0x1f: |
| 37 | return IocCtrlEventRegister(input, output); | 36 | return IocCtrlEventRegister(input, output); |
| 38 | case 0x20: | 37 | case 0x20: |
| @@ -48,14 +47,13 @@ NvResult nvhost_ctrl::Ioctl1(Ioctl command, const std::vector<u8>& input, std::v | |||
| 48 | } | 47 | } |
| 49 | 48 | ||
| 50 | NvResult nvhost_ctrl::Ioctl2(Ioctl command, const std::vector<u8>& input, | 49 | NvResult nvhost_ctrl::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 51 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 50 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 52 | IoctlCtrl& ctrl) { | ||
| 53 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 51 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 54 | return NvResult::NotImplemented; | 52 | return NvResult::NotImplemented; |
| 55 | } | 53 | } |
| 56 | 54 | ||
| 57 | NvResult nvhost_ctrl::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 55 | NvResult nvhost_ctrl::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 58 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 56 | std::vector<u8>& inline_outpu) { |
| 59 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 57 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 60 | return NvResult::NotImplemented; | 58 | return NvResult::NotImplemented; |
| 61 | } | 59 | } |
| @@ -69,7 +67,7 @@ NvResult nvhost_ctrl::NvOsGetConfigU32(const std::vector<u8>& input, std::vector | |||
| 69 | } | 67 | } |
| 70 | 68 | ||
| 71 | NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, | 69 | NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, |
| 72 | bool is_async, IoctlCtrl& ctrl) { | 70 | bool is_async) { |
| 73 | IocCtrlEventWaitParams params{}; | 71 | IocCtrlEventWaitParams params{}; |
| 74 | std::memcpy(¶ms, input.data(), sizeof(params)); | 72 | std::memcpy(¶ms, input.data(), sizeof(params)); |
| 75 | LOG_DEBUG(Service_NVDRV, "syncpt_id={}, threshold={}, timeout={}, is_async={}", | 73 | LOG_DEBUG(Service_NVDRV, "syncpt_id={}, threshold={}, timeout={}, is_async={}", |
| @@ -141,12 +139,6 @@ NvResult nvhost_ctrl::IocCtrlEventWait(const std::vector<u8>& input, std::vector | |||
| 141 | params.value |= event_id; | 139 | params.value |= event_id; |
| 142 | event.event.writable->Clear(); | 140 | event.event.writable->Clear(); |
| 143 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); | 141 | gpu.RegisterSyncptInterrupt(params.syncpt_id, target_value); |
| 144 | if (!is_async && ctrl.fresh_call) { | ||
| 145 | ctrl.must_delay = true; | ||
| 146 | ctrl.timeout = params.timeout; | ||
| 147 | ctrl.event_id = event_id; | ||
| 148 | return NvResult::Timeout; | ||
| 149 | } | ||
| 150 | std::memcpy(output.data(), ¶ms, sizeof(params)); | 142 | std::memcpy(output.data(), ¶ms, sizeof(params)); |
| 151 | return NvResult::Timeout; | 143 | return NvResult::Timeout; |
| 152 | } | 144 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h index 107168e21..c5aa1362a 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl.h | |||
| @@ -18,13 +18,11 @@ public: | |||
| 18 | SyncpointManager& syncpoint_manager); | 18 | SyncpointManager& syncpoint_manager); |
| 19 | ~nvhost_ctrl() override; | 19 | ~nvhost_ctrl() override; |
| 20 | 20 | ||
| 21 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 21 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 22 | IoctlCtrl& ctrl) override; | ||
| 23 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 22 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 24 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 23 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 25 | IoctlCtrl& ctrl) override; | ||
| 26 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 24 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 27 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 25 | std::vector<u8>& inline_output) override; |
| 28 | 26 | ||
| 29 | private: | 27 | private: |
| 30 | struct IocSyncptReadParams { | 28 | struct IocSyncptReadParams { |
| @@ -123,8 +121,7 @@ private: | |||
| 123 | static_assert(sizeof(IocCtrlEventKill) == 8, "IocCtrlEventKill is incorrect size"); | 121 | static_assert(sizeof(IocCtrlEventKill) == 8, "IocCtrlEventKill is incorrect size"); |
| 124 | 122 | ||
| 125 | NvResult NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output); | 123 | NvResult NvOsGetConfigU32(const std::vector<u8>& input, std::vector<u8>& output); |
| 126 | NvResult IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, bool is_async, | 124 | NvResult IocCtrlEventWait(const std::vector<u8>& input, std::vector<u8>& output, bool is_async); |
| 127 | IoctlCtrl& ctrl); | ||
| 128 | NvResult IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output); | 125 | NvResult IocCtrlEventRegister(const std::vector<u8>& input, std::vector<u8>& output); |
| 129 | NvResult IocCtrlEventUnregister(const std::vector<u8>& input, std::vector<u8>& output); | 126 | NvResult IocCtrlEventUnregister(const std::vector<u8>& input, std::vector<u8>& output); |
| 130 | NvResult IocCtrlClearEventWait(const std::vector<u8>& input, std::vector<u8>& output); | 127 | NvResult IocCtrlClearEventWait(const std::vector<u8>& input, std::vector<u8>& output); |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp index 647f5907e..0320d3ae2 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | |||
| @@ -16,7 +16,7 @@ nvhost_ctrl_gpu::nvhost_ctrl_gpu(Core::System& system) : nvdevice(system) {} | |||
| 16 | nvhost_ctrl_gpu::~nvhost_ctrl_gpu() = default; | 16 | nvhost_ctrl_gpu::~nvhost_ctrl_gpu() = default; |
| 17 | 17 | ||
| 18 | NvResult nvhost_ctrl_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, | 18 | NvResult nvhost_ctrl_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 19 | std::vector<u8>& output, IoctlCtrl& ctrl) { | 19 | std::vector<u8>& output) { |
| 20 | switch (command.group) { | 20 | switch (command.group) { |
| 21 | case 'G': | 21 | case 'G': |
| 22 | switch (command.cmd) { | 22 | switch (command.cmd) { |
| @@ -48,15 +48,13 @@ NvResult nvhost_ctrl_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, | |||
| 48 | } | 48 | } |
| 49 | 49 | ||
| 50 | NvResult nvhost_ctrl_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, | 50 | NvResult nvhost_ctrl_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 51 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 51 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 52 | IoctlCtrl& ctrl) { | ||
| 53 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 52 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 54 | return NvResult::NotImplemented; | 53 | return NvResult::NotImplemented; |
| 55 | } | 54 | } |
| 56 | 55 | ||
| 57 | NvResult nvhost_ctrl_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, | 56 | NvResult nvhost_ctrl_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, |
| 58 | std::vector<u8>& output, std::vector<u8>& inline_output, | 57 | std::vector<u8>& output, std::vector<u8>& inline_output) { |
| 59 | IoctlCtrl& ctrl) { | ||
| 60 | switch (command.group) { | 58 | switch (command.group) { |
| 61 | case 'G': | 59 | case 'G': |
| 62 | switch (command.cmd) { | 60 | switch (command.cmd) { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h index c2fffe734..137b88238 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | |||
| @@ -16,13 +16,11 @@ public: | |||
| 16 | explicit nvhost_ctrl_gpu(Core::System& system); | 16 | explicit nvhost_ctrl_gpu(Core::System& system); |
| 17 | ~nvhost_ctrl_gpu() override; | 17 | ~nvhost_ctrl_gpu() override; |
| 18 | 18 | ||
| 19 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 19 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 20 | IoctlCtrl& ctrl) override; | ||
| 21 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 20 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 22 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 21 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 23 | IoctlCtrl& ctrl) override; | ||
| 24 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 22 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 25 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 23 | std::vector<u8>& inline_output) override; |
| 26 | 24 | ||
| 27 | private: | 25 | private: |
| 28 | struct IoctlGpuCharacteristics { | 26 | struct IoctlGpuCharacteristics { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index b0c2caba5..af8b3d9f1 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp | |||
| @@ -23,8 +23,7 @@ nvhost_gpu::nvhost_gpu(Core::System& system, std::shared_ptr<nvmap> nvmap_dev, | |||
| 23 | 23 | ||
| 24 | nvhost_gpu::~nvhost_gpu() = default; | 24 | nvhost_gpu::~nvhost_gpu() = default; |
| 25 | 25 | ||
| 26 | NvResult nvhost_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 26 | NvResult nvhost_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
| 27 | IoctlCtrl& ctrl) { | ||
| 28 | switch (command.group) { | 27 | switch (command.group) { |
| 29 | case 0x0: | 28 | case 0x0: |
| 30 | switch (command.cmd) { | 29 | switch (command.cmd) { |
| @@ -76,8 +75,7 @@ NvResult nvhost_gpu::Ioctl1(Ioctl command, const std::vector<u8>& input, std::ve | |||
| 76 | }; | 75 | }; |
| 77 | 76 | ||
| 78 | NvResult nvhost_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, | 77 | NvResult nvhost_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 79 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 78 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 80 | IoctlCtrl& ctrl) { | ||
| 81 | switch (command.group) { | 79 | switch (command.group) { |
| 82 | case 'H': | 80 | case 'H': |
| 83 | switch (command.cmd) { | 81 | switch (command.cmd) { |
| @@ -91,7 +89,7 @@ NvResult nvhost_gpu::Ioctl2(Ioctl command, const std::vector<u8>& input, | |||
| 91 | } | 89 | } |
| 92 | 90 | ||
| 93 | NvResult nvhost_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 91 | NvResult nvhost_gpu::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 94 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 92 | std::vector<u8>& inline_output) { |
| 95 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 93 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 96 | return NvResult::NotImplemented; | 94 | return NvResult::NotImplemented; |
| 97 | } | 95 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index aa0048a9d..e0298b4fe 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h | |||
| @@ -26,13 +26,11 @@ public: | |||
| 26 | SyncpointManager& syncpoint_manager); | 26 | SyncpointManager& syncpoint_manager); |
| 27 | ~nvhost_gpu() override; | 27 | ~nvhost_gpu() override; |
| 28 | 28 | ||
| 29 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 29 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 30 | IoctlCtrl& ctrl) override; | ||
| 31 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 30 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 32 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 31 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 33 | IoctlCtrl& ctrl) override; | ||
| 34 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 32 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 35 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 33 | std::vector<u8>& inline_output) override; |
| 36 | 34 | ||
| 37 | private: | 35 | private: |
| 38 | enum class CtxObjects : u32_le { | 36 | enum class CtxObjects : u32_le { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp index b8328c314..d8735491c 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.cpp | |||
| @@ -15,8 +15,8 @@ nvhost_nvdec::nvhost_nvdec(Core::System& system, std::shared_ptr<nvmap> nvmap_de | |||
| 15 | : nvhost_nvdec_common(system, std::move(nvmap_dev)) {} | 15 | : nvhost_nvdec_common(system, std::move(nvmap_dev)) {} |
| 16 | nvhost_nvdec::~nvhost_nvdec() = default; | 16 | nvhost_nvdec::~nvhost_nvdec() = default; |
| 17 | 17 | ||
| 18 | NvResult nvhost_nvdec::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 18 | NvResult nvhost_nvdec::Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 19 | IoctlCtrl& ctrl) { | 19 | std::vector<u8>& output) { |
| 20 | switch (command.group) { | 20 | switch (command.group) { |
| 21 | case 0x0: | 21 | case 0x0: |
| 22 | switch (command.cmd) { | 22 | switch (command.cmd) { |
| @@ -58,14 +58,13 @@ NvResult nvhost_nvdec::Ioctl1(Ioctl command, const std::vector<u8>& input, std:: | |||
| 58 | } | 58 | } |
| 59 | 59 | ||
| 60 | NvResult nvhost_nvdec::Ioctl2(Ioctl command, const std::vector<u8>& input, | 60 | NvResult nvhost_nvdec::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 61 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 61 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 62 | IoctlCtrl& ctrl) { | ||
| 63 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 62 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 64 | return NvResult::NotImplemented; | 63 | return NvResult::NotImplemented; |
| 65 | } | 64 | } |
| 66 | 65 | ||
| 67 | NvResult nvhost_nvdec::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 66 | NvResult nvhost_nvdec::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 68 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 67 | std::vector<u8>& inline_output) { |
| 69 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 68 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 70 | return NvResult::NotImplemented; | 69 | return NvResult::NotImplemented; |
| 71 | } | 70 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h index 884ed6c5b..79b8b6de1 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvdec.h | |||
| @@ -14,13 +14,11 @@ public: | |||
| 14 | explicit nvhost_nvdec(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); | 14 | explicit nvhost_nvdec(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); |
| 15 | ~nvhost_nvdec() override; | 15 | ~nvhost_nvdec() override; |
| 16 | 16 | ||
| 17 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 17 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 18 | IoctlCtrl& ctrl) override; | ||
| 19 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 18 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 20 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 19 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 21 | IoctlCtrl& ctrl) override; | ||
| 22 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 20 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 23 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 21 | std::vector<u8>& inline_output) override; |
| 24 | }; | 22 | }; |
| 25 | 23 | ||
| 26 | } // namespace Service::Nvidia::Devices | 24 | } // namespace Service::Nvidia::Devices |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp index 6f4ab0ab3..2d06955c0 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.cpp | |||
| @@ -13,8 +13,8 @@ namespace Service::Nvidia::Devices { | |||
| 13 | nvhost_nvjpg::nvhost_nvjpg(Core::System& system) : nvdevice(system) {} | 13 | nvhost_nvjpg::nvhost_nvjpg(Core::System& system) : nvdevice(system) {} |
| 14 | nvhost_nvjpg::~nvhost_nvjpg() = default; | 14 | nvhost_nvjpg::~nvhost_nvjpg() = default; |
| 15 | 15 | ||
| 16 | NvResult nvhost_nvjpg::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 16 | NvResult nvhost_nvjpg::Ioctl1(Ioctl command, const std::vector<u8>& input, |
| 17 | IoctlCtrl& ctrl) { | 17 | std::vector<u8>& output) { |
| 18 | switch (command.group) { | 18 | switch (command.group) { |
| 19 | case 'H': | 19 | case 'H': |
| 20 | switch (command.cmd) { | 20 | switch (command.cmd) { |
| @@ -33,14 +33,13 @@ NvResult nvhost_nvjpg::Ioctl1(Ioctl command, const std::vector<u8>& input, std:: | |||
| 33 | } | 33 | } |
| 34 | 34 | ||
| 35 | NvResult nvhost_nvjpg::Ioctl2(Ioctl command, const std::vector<u8>& input, | 35 | NvResult nvhost_nvjpg::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 36 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 36 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 37 | IoctlCtrl& ctrl) { | ||
| 38 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 37 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 39 | return NvResult::NotImplemented; | 38 | return NvResult::NotImplemented; |
| 40 | } | 39 | } |
| 41 | 40 | ||
| 42 | NvResult nvhost_nvjpg::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 41 | NvResult nvhost_nvjpg::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 43 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 42 | std::vector<u8>& inline_output) { |
| 44 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 43 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 45 | return NvResult::NotImplemented; | 44 | return NvResult::NotImplemented; |
| 46 | } | 45 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h index 6fb99d959..43948d18d 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_nvjpg.h | |||
| @@ -16,13 +16,11 @@ public: | |||
| 16 | explicit nvhost_nvjpg(Core::System& system); | 16 | explicit nvhost_nvjpg(Core::System& system); |
| 17 | ~nvhost_nvjpg() override; | 17 | ~nvhost_nvjpg() override; |
| 18 | 18 | ||
| 19 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 19 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 20 | IoctlCtrl& ctrl) override; | ||
| 21 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 20 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 22 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 21 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 23 | IoctlCtrl& ctrl) override; | ||
| 24 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 22 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 25 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 23 | std::vector<u8>& inline_output) override; |
| 26 | 24 | ||
| 27 | private: | 25 | private: |
| 28 | struct IoctlSetNvmapFD { | 26 | struct IoctlSetNvmapFD { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp index 55a17f423..805fe86ae 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.cpp | |||
| @@ -15,8 +15,7 @@ nvhost_vic::nvhost_vic(Core::System& system, std::shared_ptr<nvmap> nvmap_dev) | |||
| 15 | 15 | ||
| 16 | nvhost_vic::~nvhost_vic() = default; | 16 | nvhost_vic::~nvhost_vic() = default; |
| 17 | 17 | ||
| 18 | NvResult nvhost_vic::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 18 | NvResult nvhost_vic::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
| 19 | IoctlCtrl& ctrl) { | ||
| 20 | switch (command.group) { | 19 | switch (command.group) { |
| 21 | case 0x0: | 20 | case 0x0: |
| 22 | switch (command.cmd) { | 21 | switch (command.cmd) { |
| @@ -51,14 +50,13 @@ NvResult nvhost_vic::Ioctl1(Ioctl command, const std::vector<u8>& input, std::ve | |||
| 51 | } | 50 | } |
| 52 | 51 | ||
| 53 | NvResult nvhost_vic::Ioctl2(Ioctl command, const std::vector<u8>& input, | 52 | NvResult nvhost_vic::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 54 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 53 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 55 | IoctlCtrl& ctrl) { | ||
| 56 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 54 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 57 | return NvResult::NotImplemented; | 55 | return NvResult::NotImplemented; |
| 58 | } | 56 | } |
| 59 | 57 | ||
| 60 | NvResult nvhost_vic::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 58 | NvResult nvhost_vic::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 61 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 59 | std::vector<u8>& inline_output) { |
| 62 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 60 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 63 | return NvResult::NotImplemented; | 61 | return NvResult::NotImplemented; |
| 64 | } | 62 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_vic.h b/src/core/hle/service/nvdrv/devices/nvhost_vic.h index 7f4858cd4..b2e11f4d4 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_vic.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_vic.h | |||
| @@ -14,12 +14,10 @@ public: | |||
| 14 | explicit nvhost_vic(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); | 14 | explicit nvhost_vic(Core::System& system, std::shared_ptr<nvmap> nvmap_dev); |
| 15 | ~nvhost_vic(); | 15 | ~nvhost_vic(); |
| 16 | 16 | ||
| 17 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 17 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 18 | IoctlCtrl& ctrl) override; | ||
| 19 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 18 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 20 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 19 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 21 | IoctlCtrl& ctrl) override; | ||
| 22 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 20 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 23 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 21 | std::vector<u8>& inline_output) override; |
| 24 | }; | 22 | }; |
| 25 | } // namespace Service::Nvidia::Devices | 23 | } // namespace Service::Nvidia::Devices |
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.cpp b/src/core/hle/service/nvdrv/devices/nvmap.cpp index 910cfee51..4015a2740 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.cpp +++ b/src/core/hle/service/nvdrv/devices/nvmap.cpp | |||
| @@ -19,8 +19,7 @@ nvmap::nvmap(Core::System& system) : nvdevice(system) { | |||
| 19 | 19 | ||
| 20 | nvmap::~nvmap() = default; | 20 | nvmap::~nvmap() = default; |
| 21 | 21 | ||
| 22 | NvResult nvmap::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 22 | NvResult nvmap::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) { |
| 23 | IoctlCtrl& ctrl) { | ||
| 24 | switch (command.group) { | 23 | switch (command.group) { |
| 25 | case 0x1: | 24 | case 0x1: |
| 26 | switch (command.cmd) { | 25 | switch (command.cmd) { |
| @@ -49,14 +48,13 @@ NvResult nvmap::Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector< | |||
| 49 | } | 48 | } |
| 50 | 49 | ||
| 51 | NvResult nvmap::Ioctl2(Ioctl command, const std::vector<u8>& input, | 50 | NvResult nvmap::Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 52 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 51 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 53 | IoctlCtrl& ctrl) { | ||
| 54 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 52 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 55 | return NvResult::NotImplemented; | 53 | return NvResult::NotImplemented; |
| 56 | } | 54 | } |
| 57 | 55 | ||
| 58 | NvResult nvmap::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 56 | NvResult nvmap::Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 59 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 57 | std::vector<u8>& inline_output) { |
| 60 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); | 58 | UNIMPLEMENTED_MSG("Unimplemented ioctl={:08X}", command.raw); |
| 61 | return NvResult::NotImplemented; | 59 | return NvResult::NotImplemented; |
| 62 | } | 60 | } |
diff --git a/src/core/hle/service/nvdrv/devices/nvmap.h b/src/core/hle/service/nvdrv/devices/nvmap.h index c0c2fa5eb..4484bd79f 100644 --- a/src/core/hle/service/nvdrv/devices/nvmap.h +++ b/src/core/hle/service/nvdrv/devices/nvmap.h | |||
| @@ -19,13 +19,11 @@ public: | |||
| 19 | explicit nvmap(Core::System& system); | 19 | explicit nvmap(Core::System& system); |
| 20 | ~nvmap() override; | 20 | ~nvmap() override; |
| 21 | 21 | ||
| 22 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 22 | NvResult Ioctl1(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output) override; |
| 23 | IoctlCtrl& ctrl) override; | ||
| 24 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, | 23 | NvResult Ioctl2(Ioctl command, const std::vector<u8>& input, |
| 25 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 24 | const std::vector<u8>& inline_input, std::vector<u8>& output) override; |
| 26 | IoctlCtrl& ctrl) override; | ||
| 27 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, | 25 | NvResult Ioctl3(Ioctl command, const std::vector<u8>& input, std::vector<u8>& output, |
| 28 | std::vector<u8>& inline_output, IoctlCtrl& ctrl) override; | 26 | std::vector<u8>& inline_output) override; |
| 29 | 27 | ||
| 30 | /// Returns the allocated address of an nvmap object given its handle. | 28 | /// Returns the allocated address of an nvmap object given its handle. |
| 31 | VAddr GetObjectAddress(u32 handle) const; | 29 | VAddr GetObjectAddress(u32 handle) const; |
diff --git a/src/core/hle/service/nvdrv/interface.cpp b/src/core/hle/service/nvdrv/interface.cpp index d72c531f6..cc23b001c 100644 --- a/src/core/hle/service/nvdrv/interface.cpp +++ b/src/core/hle/service/nvdrv/interface.cpp | |||
| @@ -61,32 +61,9 @@ void NVDRV::Ioctl1(Kernel::HLERequestContext& ctx) { | |||
| 61 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); | 61 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); |
| 62 | const auto input_buffer = ctx.ReadBuffer(0); | 62 | const auto input_buffer = ctx.ReadBuffer(0); |
| 63 | 63 | ||
| 64 | IoctlCtrl ctrl{}; | 64 | const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, output_buffer); |
| 65 | 65 | if (command.is_out != 0) { | |
| 66 | const auto nv_result = nvdrv->Ioctl1(fd, command, input_buffer, output_buffer, ctrl); | 66 | ctx.WriteBuffer(output_buffer); |
| 67 | if (ctrl.must_delay) { | ||
| 68 | ctrl.fresh_call = false; | ||
| 69 | ctx.SleepClientThread( | ||
| 70 | "NVServices::DelayedResponse", ctrl.timeout, | ||
| 71 | [=, this](std::shared_ptr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx_, | ||
| 72 | Kernel::ThreadWakeupReason reason) { | ||
| 73 | IoctlCtrl ctrl2{ctrl}; | ||
| 74 | std::vector<u8> tmp_output = output_buffer; | ||
| 75 | const auto nv_result2 = nvdrv->Ioctl1(fd, command, input_buffer, tmp_output, ctrl2); | ||
| 76 | |||
| 77 | if (command.is_out != 0) { | ||
| 78 | ctx.WriteBuffer(tmp_output); | ||
| 79 | } | ||
| 80 | |||
| 81 | IPC::ResponseBuilder rb{ctx_, 3}; | ||
| 82 | rb.Push(RESULT_SUCCESS); | ||
| 83 | rb.PushEnum(nv_result2); | ||
| 84 | }, | ||
| 85 | nvdrv->GetEventWriteable(ctrl.event_id)); | ||
| 86 | } else { | ||
| 87 | if (command.is_out != 0) { | ||
| 88 | ctx.WriteBuffer(output_buffer); | ||
| 89 | } | ||
| 90 | } | 67 | } |
| 91 | 68 | ||
| 92 | IPC::ResponseBuilder rb{ctx, 3}; | 69 | IPC::ResponseBuilder rb{ctx, 3}; |
| @@ -110,36 +87,8 @@ void NVDRV::Ioctl2(Kernel::HLERequestContext& ctx) { | |||
| 110 | const auto input_inlined_buffer = ctx.ReadBuffer(1); | 87 | const auto input_inlined_buffer = ctx.ReadBuffer(1); |
| 111 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); | 88 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); |
| 112 | 89 | ||
| 113 | IoctlCtrl ctrl{}; | ||
| 114 | |||
| 115 | const auto nv_result = | 90 | const auto nv_result = |
| 116 | nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, output_buffer, ctrl); | 91 | nvdrv->Ioctl2(fd, command, input_buffer, input_inlined_buffer, output_buffer); |
| 117 | if (ctrl.must_delay) { | ||
| 118 | ctrl.fresh_call = false; | ||
| 119 | ctx.SleepClientThread( | ||
| 120 | "NVServices::DelayedResponse", ctrl.timeout, | ||
| 121 | [=, this](std::shared_ptr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx_, | ||
| 122 | Kernel::ThreadWakeupReason reason) { | ||
| 123 | IoctlCtrl ctrl2{ctrl}; | ||
| 124 | std::vector<u8> tmp_output = output_buffer; | ||
| 125 | const auto nv_result2 = nvdrv->Ioctl2(fd, command, input_buffer, | ||
| 126 | input_inlined_buffer, tmp_output, ctrl2); | ||
| 127 | |||
| 128 | if (command.is_out != 0) { | ||
| 129 | ctx.WriteBuffer(tmp_output); | ||
| 130 | } | ||
| 131 | |||
| 132 | IPC::ResponseBuilder rb{ctx_, 3}; | ||
| 133 | rb.Push(RESULT_SUCCESS); | ||
| 134 | rb.PushEnum(nv_result2); | ||
| 135 | }, | ||
| 136 | nvdrv->GetEventWriteable(ctrl.event_id)); | ||
| 137 | } else { | ||
| 138 | if (command.is_out != 0) { | ||
| 139 | ctx.WriteBuffer(output_buffer); | ||
| 140 | } | ||
| 141 | } | ||
| 142 | |||
| 143 | if (command.is_out != 0) { | 92 | if (command.is_out != 0) { |
| 144 | ctx.WriteBuffer(output_buffer); | 93 | ctx.WriteBuffer(output_buffer); |
| 145 | } | 94 | } |
| @@ -165,36 +114,11 @@ void NVDRV::Ioctl3(Kernel::HLERequestContext& ctx) { | |||
| 165 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); | 114 | std::vector<u8> output_buffer(ctx.GetWriteBufferSize(0)); |
| 166 | std::vector<u8> output_buffer_inline(ctx.GetWriteBufferSize(1)); | 115 | std::vector<u8> output_buffer_inline(ctx.GetWriteBufferSize(1)); |
| 167 | 116 | ||
| 168 | IoctlCtrl ctrl{}; | ||
| 169 | const auto nv_result = | 117 | const auto nv_result = |
| 170 | nvdrv->Ioctl3(fd, command, input_buffer, output_buffer, output_buffer_inline, ctrl); | 118 | nvdrv->Ioctl3(fd, command, input_buffer, output_buffer, output_buffer_inline); |
| 171 | if (ctrl.must_delay) { | 119 | if (command.is_out != 0) { |
| 172 | ctrl.fresh_call = false; | 120 | ctx.WriteBuffer(output_buffer, 0); |
| 173 | ctx.SleepClientThread( | 121 | ctx.WriteBuffer(output_buffer_inline, 1); |
| 174 | "NVServices::DelayedResponse", ctrl.timeout, | ||
| 175 | [=, this](std::shared_ptr<Kernel::Thread> thread, Kernel::HLERequestContext& ctx_, | ||
| 176 | Kernel::ThreadWakeupReason reason) { | ||
| 177 | IoctlCtrl ctrl2{ctrl}; | ||
| 178 | std::vector<u8> tmp_output = output_buffer; | ||
| 179 | std::vector<u8> tmp_output2 = output_buffer; | ||
| 180 | const auto nv_result2 = | ||
| 181 | nvdrv->Ioctl3(fd, command, input_buffer, tmp_output, tmp_output2, ctrl2); | ||
| 182 | |||
| 183 | if (command.is_out != 0) { | ||
| 184 | ctx.WriteBuffer(tmp_output, 0); | ||
| 185 | ctx.WriteBuffer(tmp_output2, 1); | ||
| 186 | } | ||
| 187 | |||
| 188 | IPC::ResponseBuilder rb{ctx_, 3}; | ||
| 189 | rb.Push(RESULT_SUCCESS); | ||
| 190 | rb.PushEnum(nv_result2); | ||
| 191 | }, | ||
| 192 | nvdrv->GetEventWriteable(ctrl.event_id)); | ||
| 193 | } else { | ||
| 194 | if (command.is_out != 0) { | ||
| 195 | ctx.WriteBuffer(output_buffer, 0); | ||
| 196 | ctx.WriteBuffer(output_buffer_inline, 1); | ||
| 197 | } | ||
| 198 | } | 122 | } |
| 199 | 123 | ||
| 200 | IPC::ResponseBuilder rb{ctx, 3}; | 124 | IPC::ResponseBuilder rb{ctx, 3}; |
diff --git a/src/core/hle/service/nvdrv/nvdata.h b/src/core/hle/service/nvdrv/nvdata.h index a3c4ecd85..3294bc0e7 100644 --- a/src/core/hle/service/nvdrv/nvdata.h +++ b/src/core/hle/service/nvdrv/nvdata.h | |||
| @@ -97,15 +97,4 @@ union Ioctl { | |||
| 97 | BitField<31, 1, u32> is_out; | 97 | BitField<31, 1, u32> is_out; |
| 98 | }; | 98 | }; |
| 99 | 99 | ||
| 100 | struct IoctlCtrl { | ||
| 101 | // First call done to the servioce for services that call itself again after a call. | ||
| 102 | bool fresh_call{true}; | ||
| 103 | // Tells the Ioctl Wrapper that it must delay the IPC response and send the thread to sleep | ||
| 104 | bool must_delay{}; | ||
| 105 | // Timeout for the delay | ||
| 106 | s64 timeout{}; | ||
| 107 | // NV Event Id | ||
| 108 | s32 event_id{-1}; | ||
| 109 | }; | ||
| 110 | |||
| 111 | } // namespace Service::Nvidia | 100 | } // namespace Service::Nvidia |
diff --git a/src/core/hle/service/nvdrv/nvdrv.cpp b/src/core/hle/service/nvdrv/nvdrv.cpp index 8e0c9f093..e03195afe 100644 --- a/src/core/hle/service/nvdrv/nvdrv.cpp +++ b/src/core/hle/service/nvdrv/nvdrv.cpp | |||
| @@ -91,7 +91,7 @@ DeviceFD Module::Open(const std::string& device_name) { | |||
| 91 | } | 91 | } |
| 92 | 92 | ||
| 93 | NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 93 | NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 94 | std::vector<u8>& output, IoctlCtrl& ctrl) { | 94 | std::vector<u8>& output) { |
| 95 | if (fd < 0) { | 95 | if (fd < 0) { |
| 96 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | 96 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); |
| 97 | return NvResult::InvalidState; | 97 | return NvResult::InvalidState; |
| @@ -104,12 +104,11 @@ NvResult Module::Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input | |||
| 104 | return NvResult::NotImplemented; | 104 | return NvResult::NotImplemented; |
| 105 | } | 105 | } |
| 106 | 106 | ||
| 107 | return itr->second->Ioctl1(command, input, output, ctrl); | 107 | return itr->second->Ioctl1(command, input, output); |
| 108 | } | 108 | } |
| 109 | 109 | ||
| 110 | NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 110 | NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 111 | const std::vector<u8>& inline_input, std::vector<u8>& output, | 111 | const std::vector<u8>& inline_input, std::vector<u8>& output) { |
| 112 | IoctlCtrl& ctrl) { | ||
| 113 | if (fd < 0) { | 112 | if (fd < 0) { |
| 114 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | 113 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); |
| 115 | return NvResult::InvalidState; | 114 | return NvResult::InvalidState; |
| @@ -122,11 +121,11 @@ NvResult Module::Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input | |||
| 122 | return NvResult::NotImplemented; | 121 | return NvResult::NotImplemented; |
| 123 | } | 122 | } |
| 124 | 123 | ||
| 125 | return itr->second->Ioctl2(command, input, inline_input, output, ctrl); | 124 | return itr->second->Ioctl2(command, input, inline_input, output); |
| 126 | } | 125 | } |
| 127 | 126 | ||
| 128 | NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 127 | NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 129 | std::vector<u8>& output, std::vector<u8>& inline_output, IoctlCtrl& ctrl) { | 128 | std::vector<u8>& output, std::vector<u8>& inline_output) { |
| 130 | if (fd < 0) { | 129 | if (fd < 0) { |
| 131 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); | 130 | LOG_ERROR(Service_NVDRV, "Invalid DeviceFD={}!", fd); |
| 132 | return NvResult::InvalidState; | 131 | return NvResult::InvalidState; |
| @@ -139,7 +138,7 @@ NvResult Module::Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input | |||
| 139 | return NvResult::NotImplemented; | 138 | return NvResult::NotImplemented; |
| 140 | } | 139 | } |
| 141 | 140 | ||
| 142 | return itr->second->Ioctl3(command, input, output, inline_output, ctrl); | 141 | return itr->second->Ioctl3(command, input, output, inline_output); |
| 143 | } | 142 | } |
| 144 | 143 | ||
| 145 | NvResult Module::Close(DeviceFD fd) { | 144 | NvResult Module::Close(DeviceFD fd) { |
diff --git a/src/core/hle/service/nvdrv/nvdrv.h b/src/core/hle/service/nvdrv/nvdrv.h index 5985d2179..144e657e5 100644 --- a/src/core/hle/service/nvdrv/nvdrv.h +++ b/src/core/hle/service/nvdrv/nvdrv.h | |||
| @@ -119,13 +119,13 @@ public: | |||
| 119 | 119 | ||
| 120 | /// Sends an ioctl command to the specified file descriptor. | 120 | /// Sends an ioctl command to the specified file descriptor. |
| 121 | NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 121 | NvResult Ioctl1(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 122 | std::vector<u8>& output, IoctlCtrl& ctrl); | 122 | std::vector<u8>& output); |
| 123 | 123 | ||
| 124 | NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 124 | NvResult Ioctl2(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 125 | const std::vector<u8>& inline_input, std::vector<u8>& output, IoctlCtrl& ctrl); | 125 | const std::vector<u8>& inline_input, std::vector<u8>& output); |
| 126 | 126 | ||
| 127 | NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, | 127 | NvResult Ioctl3(DeviceFD fd, Ioctl command, const std::vector<u8>& input, |
| 128 | std::vector<u8>& output, std::vector<u8>& inline_output, IoctlCtrl& ctrl); | 128 | std::vector<u8>& output, std::vector<u8>& inline_output); |
| 129 | 129 | ||
| 130 | /// Closes a device file descriptor and returns operation success. | 130 | /// Closes a device file descriptor and returns operation success. |
| 131 | NvResult Close(DeviceFD fd); | 131 | NvResult Close(DeviceFD fd); |