Просмотр исходного кода

Merge pull request #1762 from bunnei/getgputime

nvhost_ctrl_gpu: Implement IoctlGetGpuTime.
bunnei 7 лет назад
Родитель
Сommit
cb5b68cb0a

+ 13 - 0
src/core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.cpp

@@ -5,6 +5,8 @@
 #include <cstring>
 #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<u8>& 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<u8>& input, std::vector<u8>& outp
     return 0;
 }
 
+u32 nvhost_ctrl_gpu::GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output) {
+    LOG_DEBUG(Service_NVDRV, "called");
+    IoctlGetGpuTime params{};
+    std::memcpy(&params, input.data(), input.size());
+    params.gpu_time = CoreTiming::cyclesToNs(CoreTiming::GetTicks());
+    std::memcpy(output.data(), &params, output.size());
+    return 0;
+}
+
 } // namespace Service::Nvidia::Devices

+ 6 - 0
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<u8>& input, std::vector<u8>& output);
     u32 GetTPCMasks(const std::vector<u8>& input, std::vector<u8>& output);
     u32 GetActiveSlotMask(const std::vector<u8>& input, std::vector<u8>& output);
@@ -164,6 +169,7 @@ private:
     u32 ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output);
     u32 ZBCQueryTable(const std::vector<u8>& input, std::vector<u8>& output);
     u32 FlushL2(const std::vector<u8>& input, std::vector<u8>& output);
+    u32 GetGpuTime(const std::vector<u8>& input, std::vector<u8>& output);
 };
 
 } // namespace Service::Nvidia::Devices