diff options
Diffstat (limited to 'src/core')
| -rw-r--r-- | src/core/frontend/framebuffer_layout.cpp | 21 | ||||
| -rw-r--r-- | src/core/frontend/framebuffer_layout.h | 15 | ||||
| -rw-r--r-- | src/core/hle/service/ldn/ldn.cpp | 10 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp | 12 | ||||
| -rw-r--r-- | src/core/hle/service/nvdrv/devices/nvhost_gpu.h | 8 | ||||
| -rw-r--r-- | src/core/settings.h | 1 |
6 files changed, 63 insertions, 4 deletions
diff --git a/src/core/frontend/framebuffer_layout.cpp b/src/core/frontend/framebuffer_layout.cpp index d6d2cf3f0..2dc795d56 100644 --- a/src/core/frontend/framebuffer_layout.cpp +++ b/src/core/frontend/framebuffer_layout.cpp | |||
| @@ -27,9 +27,9 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height) { | |||
| 27 | // so just calculate them both even if the other isn't showing. | 27 | // so just calculate them both even if the other isn't showing. |
| 28 | FramebufferLayout res{width, height}; | 28 | FramebufferLayout res{width, height}; |
| 29 | 29 | ||
| 30 | const float emulation_aspect_ratio{static_cast<float>(ScreenUndocked::Height) / | 30 | const float window_aspect_ratio = static_cast<float>(height) / width; |
| 31 | ScreenUndocked::Width}; | 31 | const float emulation_aspect_ratio = EmulationAspectRatio( |
| 32 | const auto window_aspect_ratio = static_cast<float>(height) / width; | 32 | static_cast<AspectRatio>(Settings::values.aspect_ratio), window_aspect_ratio); |
| 33 | 33 | ||
| 34 | const Common::Rectangle<u32> screen_window_area{0, 0, width, height}; | 34 | const Common::Rectangle<u32> screen_window_area{0, 0, width, height}; |
| 35 | Common::Rectangle<u32> screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); | 35 | Common::Rectangle<u32> screen = MaxRectangle(screen_window_area, emulation_aspect_ratio); |
| @@ -58,4 +58,19 @@ FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale) { | |||
| 58 | return DefaultFrameLayout(width, height); | 58 | return DefaultFrameLayout(width, height); |
| 59 | } | 59 | } |
| 60 | 60 | ||
| 61 | float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio) { | ||
| 62 | switch (aspect) { | ||
| 63 | case AspectRatio::Default: | ||
| 64 | return static_cast<float>(ScreenUndocked::Height) / ScreenUndocked::Width; | ||
| 65 | case AspectRatio::R4_3: | ||
| 66 | return 3.0f / 4.0f; | ||
| 67 | case AspectRatio::R21_9: | ||
| 68 | return 9.0f / 21.0f; | ||
| 69 | case AspectRatio::StretchToWindow: | ||
| 70 | return window_aspect_ratio; | ||
| 71 | default: | ||
| 72 | return static_cast<float>(ScreenUndocked::Height) / ScreenUndocked::Width; | ||
| 73 | } | ||
| 74 | } | ||
| 75 | |||
| 61 | } // namespace Layout | 76 | } // namespace Layout |
diff --git a/src/core/frontend/framebuffer_layout.h b/src/core/frontend/framebuffer_layout.h index d2370adde..1d39c1faf 100644 --- a/src/core/frontend/framebuffer_layout.h +++ b/src/core/frontend/framebuffer_layout.h | |||
| @@ -18,6 +18,13 @@ enum ScreenDocked : u32 { | |||
| 18 | HeightDocked = 1080, | 18 | HeightDocked = 1080, |
| 19 | }; | 19 | }; |
| 20 | 20 | ||
| 21 | enum class AspectRatio { | ||
| 22 | Default, | ||
| 23 | R4_3, | ||
| 24 | R21_9, | ||
| 25 | StretchToWindow, | ||
| 26 | }; | ||
| 27 | |||
| 21 | /// Describes the layout of the window framebuffer | 28 | /// Describes the layout of the window framebuffer |
| 22 | struct FramebufferLayout { | 29 | struct FramebufferLayout { |
| 23 | u32 width{ScreenUndocked::Width}; | 30 | u32 width{ScreenUndocked::Width}; |
| @@ -48,4 +55,12 @@ FramebufferLayout DefaultFrameLayout(u32 width, u32 height); | |||
| 48 | */ | 55 | */ |
| 49 | FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); | 56 | FramebufferLayout FrameLayoutFromResolutionScale(u32 res_scale); |
| 50 | 57 | ||
| 58 | /** | ||
| 59 | * Convenience method to determine emulation aspect ratio | ||
| 60 | * @param aspect Represents the index of aspect ratio stored in Settings::values.aspect_ratio | ||
| 61 | * @param window_aspect_ratio Current window aspect ratio | ||
| 62 | * @return Emulation render window aspect ratio | ||
| 63 | */ | ||
| 64 | float EmulationAspectRatio(AspectRatio aspect, float window_aspect_ratio); | ||
| 65 | |||
| 51 | } // namespace Layout | 66 | } // namespace Layout |
diff --git a/src/core/hle/service/ldn/ldn.cpp b/src/core/hle/service/ldn/ldn.cpp index ed5059047..92adde6d4 100644 --- a/src/core/hle/service/ldn/ldn.cpp +++ b/src/core/hle/service/ldn/ldn.cpp | |||
| @@ -129,12 +129,20 @@ public: | |||
| 129 | {304, nullptr, "Disconnect"}, | 129 | {304, nullptr, "Disconnect"}, |
| 130 | {400, nullptr, "Initialize"}, | 130 | {400, nullptr, "Initialize"}, |
| 131 | {401, nullptr, "Finalize"}, | 131 | {401, nullptr, "Finalize"}, |
| 132 | {402, nullptr, "SetOperationMode"}, | 132 | {402, &IUserLocalCommunicationService::Initialize2, "Initialize2"}, // 7.0.0+ |
| 133 | }; | 133 | }; |
| 134 | // clang-format on | 134 | // clang-format on |
| 135 | 135 | ||
| 136 | RegisterHandlers(functions); | 136 | RegisterHandlers(functions); |
| 137 | } | 137 | } |
| 138 | |||
| 139 | void Initialize2(Kernel::HLERequestContext& ctx) { | ||
| 140 | LOG_WARNING(Service_LDN, "(STUBBED) called"); | ||
| 141 | // Result success seem make this services start network and continue. | ||
| 142 | // If we just pass result error then it will stop and maybe try again and again. | ||
| 143 | IPC::ResponseBuilder rb{ctx, 2}; | ||
| 144 | rb.Push(RESULT_UNKNOWN); | ||
| 145 | } | ||
| 138 | }; | 146 | }; |
| 139 | 147 | ||
| 140 | class LDNS final : public ServiceFramework<LDNS> { | 148 | class LDNS final : public ServiceFramework<LDNS> { |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp index 6d8bca8bb..f1966ac0e 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.cpp | |||
| @@ -44,6 +44,8 @@ u32 nvhost_gpu::ioctl(Ioctl command, const std::vector<u8>& input, const std::ve | |||
| 44 | return GetWaitbase(input, output); | 44 | return GetWaitbase(input, output); |
| 45 | case IoctlCommand::IocChannelSetTimeoutCommand: | 45 | case IoctlCommand::IocChannelSetTimeoutCommand: |
| 46 | return ChannelSetTimeout(input, output); | 46 | return ChannelSetTimeout(input, output); |
| 47 | case IoctlCommand::IocChannelSetTimeslice: | ||
| 48 | return ChannelSetTimeslice(input, output); | ||
| 47 | default: | 49 | default: |
| 48 | break; | 50 | break; |
| 49 | } | 51 | } |
| @@ -228,4 +230,14 @@ u32 nvhost_gpu::ChannelSetTimeout(const std::vector<u8>& input, std::vector<u8>& | |||
| 228 | return 0; | 230 | return 0; |
| 229 | } | 231 | } |
| 230 | 232 | ||
| 233 | u32 nvhost_gpu::ChannelSetTimeslice(const std::vector<u8>& input, std::vector<u8>& output) { | ||
| 234 | IoctlSetTimeslice params{}; | ||
| 235 | std::memcpy(¶ms, input.data(), sizeof(IoctlSetTimeslice)); | ||
| 236 | LOG_INFO(Service_NVDRV, "called, timeslice=0x{:X}", params.timeslice); | ||
| 237 | |||
| 238 | channel_timeslice = params.timeslice; | ||
| 239 | |||
| 240 | return 0; | ||
| 241 | } | ||
| 242 | |||
| 231 | } // namespace Service::Nvidia::Devices | 243 | } // namespace Service::Nvidia::Devices |
diff --git a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h index d056dd046..2ac74743f 100644 --- a/src/core/hle/service/nvdrv/devices/nvhost_gpu.h +++ b/src/core/hle/service/nvdrv/devices/nvhost_gpu.h | |||
| @@ -48,6 +48,7 @@ private: | |||
| 48 | IocAllocObjCtxCommand = 0xC0104809, | 48 | IocAllocObjCtxCommand = 0xC0104809, |
| 49 | IocChannelGetWaitbaseCommand = 0xC0080003, | 49 | IocChannelGetWaitbaseCommand = 0xC0080003, |
| 50 | IocChannelSetTimeoutCommand = 0x40044803, | 50 | IocChannelSetTimeoutCommand = 0x40044803, |
| 51 | IocChannelSetTimeslice = 0xC004481D, | ||
| 51 | }; | 52 | }; |
| 52 | 53 | ||
| 53 | enum class CtxObjects : u32_le { | 54 | enum class CtxObjects : u32_le { |
| @@ -101,6 +102,11 @@ private: | |||
| 101 | static_assert(sizeof(IoctlChannelSetPriority) == 4, | 102 | static_assert(sizeof(IoctlChannelSetPriority) == 4, |
| 102 | "IoctlChannelSetPriority is incorrect size"); | 103 | "IoctlChannelSetPriority is incorrect size"); |
| 103 | 104 | ||
| 105 | struct IoctlSetTimeslice { | ||
| 106 | u32_le timeslice; | ||
| 107 | }; | ||
| 108 | static_assert(sizeof(IoctlSetTimeslice) == 4, "IoctlSetTimeslice is incorrect size"); | ||
| 109 | |||
| 104 | struct IoctlEventIdControl { | 110 | struct IoctlEventIdControl { |
| 105 | u32_le cmd; // 0=disable, 1=enable, 2=clear | 111 | u32_le cmd; // 0=disable, 1=enable, 2=clear |
| 106 | u32_le id; | 112 | u32_le id; |
| @@ -174,6 +180,7 @@ private: | |||
| 174 | u64_le user_data{}; | 180 | u64_le user_data{}; |
| 175 | IoctlZCullBind zcull_params{}; | 181 | IoctlZCullBind zcull_params{}; |
| 176 | u32_le channel_priority{}; | 182 | u32_le channel_priority{}; |
| 183 | u32_le channel_timeslice{}; | ||
| 177 | 184 | ||
| 178 | u32 SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output); | 185 | u32 SetNVMAPfd(const std::vector<u8>& input, std::vector<u8>& output); |
| 179 | u32 SetClientData(const std::vector<u8>& input, std::vector<u8>& output); | 186 | u32 SetClientData(const std::vector<u8>& input, std::vector<u8>& output); |
| @@ -188,6 +195,7 @@ private: | |||
| 188 | const std::vector<u8>& input2, IoctlVersion version); | 195 | const std::vector<u8>& input2, IoctlVersion version); |
| 189 | u32 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output); | 196 | u32 GetWaitbase(const std::vector<u8>& input, std::vector<u8>& output); |
| 190 | u32 ChannelSetTimeout(const std::vector<u8>& input, std::vector<u8>& output); | 197 | u32 ChannelSetTimeout(const std::vector<u8>& input, std::vector<u8>& output); |
| 198 | u32 ChannelSetTimeslice(const std::vector<u8>& input, std::vector<u8>& output); | ||
| 191 | 199 | ||
| 192 | std::shared_ptr<nvmap> nvmap_dev; | 200 | std::shared_ptr<nvmap> nvmap_dev; |
| 193 | u32 assigned_syncpoints{}; | 201 | u32 assigned_syncpoints{}; |
diff --git a/src/core/settings.h b/src/core/settings.h index e1a9a0ffa..f837d3fbc 100644 --- a/src/core/settings.h +++ b/src/core/settings.h | |||
| @@ -429,6 +429,7 @@ struct Values { | |||
| 429 | int vulkan_device; | 429 | int vulkan_device; |
| 430 | 430 | ||
| 431 | float resolution_factor; | 431 | float resolution_factor; |
| 432 | int aspect_ratio; | ||
| 432 | bool use_frame_limit; | 433 | bool use_frame_limit; |
| 433 | u16 frame_limit; | 434 | u16 frame_limit; |
| 434 | bool use_disk_shader_cache; | 435 | bool use_disk_shader_cache; |