Browse Source

[gpu/NVDRV] Unstub SetChannelPriority and adjust ChannelSetTimeSlice (#3017)

Games usually rely on either 1 of this services or both.
The last call adjusts channel_timeslice.
This behavior closely resembles Ryujinx accurate behavior for setting the channel_timeslice accordingly to the situation.

Reviewed-on: https://git.eden-emu.dev/eden-emu/eden/pulls/3017
Reviewed-by: Caio Oliveira <caiooliveirafarias0@gmail.com>
Reviewed-by: crueter <crueter@eden-emu.dev>
Co-authored-by: SDK Chan <sdkchan@eden-emu.dev>
Co-committed-by: SDK Chan <sdkchan@eden-emu.dev>
pull/3018/head
SDK Chan 1 month ago
committed by crueter
parent
commit
680384f7b8
No known key found for this signature in database GPG Key ID: 425ACD2D4830EBC6
  1. 14
      src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp
  2. 6
      src/core/hle/service/nvdrv/devices/nvhost_gpu.h

14
src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp

@ -168,7 +168,15 @@ NvResult nvhost_gpu::SetErrorNotifier(IoctlSetErrorNotifier& params) {
NvResult nvhost_gpu::SetChannelPriority(IoctlChannelSetPriority& params) {
channel_priority = params.priority;
LOG_DEBUG(Service_NVDRV, "(STUBBED) called, priority={:X}", channel_priority);
LOG_INFO(Service_NVDRV, "called, priority={:X}", channel_priority);
switch (static_cast<ChannelPriority>(channel_priority)) {
case ChannelPriority::Low: channel_timeslice = 1300; break;
case ChannelPriority::Medium: channel_timeslice = 2600; break;
case ChannelPriority::High: channel_timeslice = 5200; break;
default : return NvResult::BadParameter;
}
return NvResult::Success;
}
@ -402,6 +410,10 @@ NvResult nvhost_gpu::ChannelSetTimeout(IoctlChannelSetTimeout& params) {
NvResult nvhost_gpu::ChannelSetTimeslice(IoctlSetTimeslice& params) {
LOG_INFO(Service_NVDRV, "called, timeslice={:#X}", params.timeslice);
if (params.timeslice < 1000 || params.timeslice > 5000) {
return NvResult::BadParameter;
}
channel_timeslice = params.timeslice;
return NvResult::Success;

6
src/core/hle/service/nvdrv/devices/nvhost_gpu.h

@ -66,6 +66,12 @@ private:
CtxChannelGPFIFO = 0xB06F,
};
enum class ChannelPriority : u32 {
Low = 0x32,
Medium = 0x64,
High = 0x96,
};
struct IoctlSetNvmapFD {
s32_le nvmap_fd{};
};

Loading…
Cancel
Save