From 7f10db1c205cb6b66fd54cd3027147612fe0b26d Mon Sep 17 00:00:00 2001 From: bunnei Date: Wed, 21 Nov 2018 11:43:25 -0500 Subject: [PATCH] nvhost_ctrl_gpu: Implement IoctlGetGpuTime. - Used by Undertale. --- .../hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp | 13 +++++++++++++ .../hle/service/nvdrv/devices/nvhost_ctrl_gpu.h | 6 ++++++ 2 files changed, 19 insertions(+) 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 @@ #include #include "common/assert.h" #include "common/logging/log.h" +#include "core/core_timing.h" +#include "core/core_timing_util.h" #include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h" namespace Service::Nvidia::Devices { @@ -33,6 +35,8 @@ u32 nvhost_ctrl_gpu::ioctl(Ioctl command, const std::vector& input, std::vec return ZBCQueryTable(input, output); case IoctlCommand::IocFlushL2: return FlushL2(input, output); + case IoctlCommand::IocGetGpuTime: + return GetGpuTime(input, output); } UNIMPLEMENTED_MSG("Unimplemented ioctl"); return 0; @@ -169,4 +173,13 @@ u32 nvhost_ctrl_gpu::FlushL2(const std::vector& input, std::vector& outp return 0; } +u32 nvhost_ctrl_gpu::GetGpuTime(const std::vector& input, std::vector& output) { + LOG_DEBUG(Service_NVDRV, "called"); + IoctlGetGpuTime params{}; + std::memcpy(¶ms, input.data(), input.size()); + params.gpu_time = CoreTiming::cyclesToNs(CoreTiming::GetTicks()); + std::memcpy(output.data(), ¶ms, output.size()); + return 0; +} + } // 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: }; static_assert(sizeof(IoctlFlushL2) == 8, "IoctlFlushL2 is incorrect size"); + struct IoctlGetGpuTime { + u64_le gpu_time; + }; + static_assert(sizeof(IoctlGetGpuTime) == 8, "IoctlGetGpuTime is incorrect size"); + u32 GetCharacteristics(const std::vector& input, std::vector& output); u32 GetTPCMasks(const std::vector& input, std::vector& output); u32 GetActiveSlotMask(const std::vector& input, std::vector& output); @@ -164,6 +169,7 @@ private: u32 ZBCSetTable(const std::vector& input, std::vector& output); u32 ZBCQueryTable(const std::vector& input, std::vector& output); u32 FlushL2(const std::vector& input, std::vector& output); + u32 GetGpuTime(const std::vector& input, std::vector& output); }; } // namespace Service::Nvidia::Devices