mirror of
				https://git.suyu.dev/suyu/suyu.git
				synced 2025-11-04 12:34:39 +08:00 
			
		
		
		
	nvhost_ctrl_gpu: Implement IoctlGetGpuTime.
- Used by Undertale.
This commit is contained in:
		
							parent
							
								
									bb175ab430
								
							
						
					
					
						commit
						7f10db1c20
					
				@ -5,6 +5,8 @@
 | 
				
			|||||||
#include <cstring>
 | 
					#include <cstring>
 | 
				
			||||||
#include "common/assert.h"
 | 
					#include "common/assert.h"
 | 
				
			||||||
#include "common/logging/log.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"
 | 
					#include "core/hle/service/nvdrv/devices/nvhost_ctrl_gpu.h"
 | 
				
			||||||
 | 
					
 | 
				
			||||||
namespace Service::Nvidia::Devices {
 | 
					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);
 | 
					        return ZBCQueryTable(input, output);
 | 
				
			||||||
    case IoctlCommand::IocFlushL2:
 | 
					    case IoctlCommand::IocFlushL2:
 | 
				
			||||||
        return FlushL2(input, output);
 | 
					        return FlushL2(input, output);
 | 
				
			||||||
 | 
					    case IoctlCommand::IocGetGpuTime:
 | 
				
			||||||
 | 
					        return GetGpuTime(input, output);
 | 
				
			||||||
    }
 | 
					    }
 | 
				
			||||||
    UNIMPLEMENTED_MSG("Unimplemented ioctl");
 | 
					    UNIMPLEMENTED_MSG("Unimplemented ioctl");
 | 
				
			||||||
    return 0;
 | 
					    return 0;
 | 
				
			||||||
@ -169,4 +173,13 @@ u32 nvhost_ctrl_gpu::FlushL2(const std::vector<u8>& input, std::vector<u8>& outp
 | 
				
			|||||||
    return 0;
 | 
					    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(¶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
 | 
					} // namespace Service::Nvidia::Devices
 | 
				
			||||||
 | 
				
			|||||||
@ -156,6 +156,11 @@ private:
 | 
				
			|||||||
    };
 | 
					    };
 | 
				
			||||||
    static_assert(sizeof(IoctlFlushL2) == 8, "IoctlFlushL2 is incorrect size");
 | 
					    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 GetCharacteristics(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
    u32 GetTPCMasks(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);
 | 
					    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 ZBCSetTable(const std::vector<u8>& input, std::vector<u8>& output);
 | 
				
			||||||
    u32 ZBCQueryTable(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 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
 | 
					} // namespace Service::Nvidia::Devices
 | 
				
			||||||
 | 
				
			|||||||
		Loading…
	
	
			
			x
			
			
		
	
		Reference in New Issue
	
	Block a user