diff options
| author | 2018-11-21 11:43:25 -0500 | |
|---|---|---|
| committer | 2018-11-21 11:43:25 -0500 | |
| commit | 7f10db1c205cb6b66fd54cd3027147612fe0b26d (patch) | |
| tree | 0aac5f553f9074e44fdf0f3203e06d898a460636 | |
| parent | Merge pull request #1754 from ReinUsesLisp/zero-register (diff) | |
| download | yuzu-7f10db1c205cb6b66fd54cd3027147612fe0b26d.tar.gz yuzu-7f10db1c205cb6b66fd54cd3027147612fe0b26d.tar.xz yuzu-7f10db1c205cb6b66fd54cd3027147612fe0b26d.zip | |
nvhost_ctrl_gpu: Implement IoctlGetGpuTime.
- Used by Undertale.
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 13 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | 6 |
2 files changed, 19 insertions, 0 deletions
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 7a88ae029..792d26e52 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | |||
| @@ -5,6 +5,8 @@ | |||
| 5 | #include <cstring> | 5 | #include <cstring> |
| 6 | #include "common/assert.h" | 6 | #include "common/assert.h" |
| 7 | #include "common/logging/log.h" | 7 | #include "common/logging/log.h" |
| 8 | #include "core/core_timing.h" | ||
| 9 | #include "core/core_timing_util.h" | ||
| 8 | #include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h" | 10 | #include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h" |
| 9 | 11 | ||
| 10 | namespace Service::Nvidia::Devices { | 12 | namespace Service::Nvidia::Devices { |
| @@ -33,6 +35,8 @@ u32 nvhost_ctrl_gpu::ioctl(Ioctl command, const std::vector<u8>& input, std::vec | |||
| 33 | return ZBCQueryTable(input, output); | 35 | return ZBCQueryTable(input, output); |
| 34 | case IoctlCommand::IocFlushL2: | 36 | case IoctlCommand::IocFlushL2: |
| 35 | return FlushL2(input, output); | 37 | return FlushL2(input, output); |
| 38 | case IoctlCommand::IocGetGpuTime: | ||
| 39 | return GetGpuTime(input, output); | ||
| 36 | } | 40 | } |
| 37 | UNIMPLEMENTED_MSG("Unimplemented ioctl"); | 41 | UNIMPLEMENTED_MSG("Unimplemented ioctl"); |
| 38 | return 0; | 42 | return 0; |
| @@ -169,4 +173,13 @@ u32 nvhost_ctrl_gpu::FlushL2(const std::vector<u8>& input, std::vector<u8>& outp | |||
| 169 | return 0; | 173 | return 0; |
| 170 | } | 174 | } |
| 171 | 175 | ||
| 176 | u32 nvhost_ctrl_gpu::GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output) { | ||
| 177 | LOG_DEBUG(Service_NVDRV, "called"); | ||
| 178 | IoctlGetGpuTime params{}; | ||
| 179 | std::memcpy(¶ms, input.data(), input.size()); | ||
| 180 | params.gpu_time = CoreTiming::cyclesToNs(CoreTiming::GetTicks()); | ||
| 181 | std::memcpy(output.data(), ¶ms, output.size()); | ||
| 182 | return 0; | ||
| 183 | } | ||
| 184 | |||
| 172 | } // namespace Service::Nvidia::Devices | 185 | } // namespace Service::Nvidia::Devices |
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 3bbf028ad..240435eea 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | |||
| @@ -156,6 +156,11 @@ private: | |||
| 156 | }; | 156 | }; |
| 157 | static_assert(sizeof(IoctlFlushL2) == 8, "IoctlFlushL2 is incorrect size"); | 157 | static_assert(sizeof(IoctlFlushL2) == 8, "IoctlFlushL2 is incorrect size"); |
| 158 | 158 | ||
| 159 | struct IoctlGetGpuTime { | ||
| 160 | u64_le gpu_time; | ||
| 161 | }; | ||
| 162 | static_assert(sizeof(IoctlGetGpuTime) == 8, "IoctlGetGpuTime is incorrect size"); | ||
| 163 | |||
| 159 | u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output); | 164 | u32 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output); |
| 160 | u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); | 165 | u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output); |
| 161 | u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); | 166 | u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output); |
| @@ -164,6 +169,7 @@ private: | |||
| 164 | u32 ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output); | 169 | u32 ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output); |
| 165 | u32 ZBCQueryTable(const std::vector<u8>& input, std::vector<u8>& output); | 170 | u32 ZBCQueryTable(const std::vector<u8>& input, std::vector<u8>& output); |
| 166 | u32 FlushL2(const std::vector<u8>& input, std::vector<u8>& output); | 171 | u32 FlushL2(const std::vector<u8>& input, std::vector<u8>& output); |
| 172 | u32 GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output); | ||
| 167 | }; | 173 | }; |
| 168 | 174 | ||
| 169 | } // namespace Service::Nvidia::Devices | 175 | } // namespace Service::Nvidia::Devices |