diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 59 |
1 files changed, 38 insertions, 21 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index 8528925ec..266909ba4 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -32,6 +32,9 @@ | |||
| 32 | 32 | ||
| 33 | namespace Service::VI { | 33 | namespace Service::VI { |
| 34 | 34 | ||
| 35 | constexpr ResultCode ERR_OPERATION_FAILED{ErrorModule::VI, 1}; | ||
| 36 | constexpr ResultCode ERR_UNSUPPORTED{ErrorModule::VI, 6}; | ||
| 37 | |||
| 35 | struct DisplayInfo { | 38 | struct DisplayInfo { |
| 36 | /// The name of this particular display. | 39 | /// The name of this particular display. |
| 37 | char display_name[0x40]{"Default"}; | 40 | char display_name[0x40]{"Default"}; |
| @@ -874,6 +877,24 @@ public: | |||
| 874 | ~IApplicationDisplayService() = default; | 877 | ~IApplicationDisplayService() = default; |
| 875 | 878 | ||
| 876 | private: | 879 | private: |
| 880 | enum class ConvertedScaleMode : u64 { | ||
| 881 | None = 0, // VI seems to name this as "Unknown" but lots of games pass it, assume it's no | ||
| 882 | // scaling/default | ||
| 883 | Freeze = 1, | ||
| 884 | ScaleToWindow = 2, | ||
| 885 | Crop = 3, | ||
| 886 | NoCrop = 4, | ||
| 887 | }; | ||
| 888 | |||
| 889 | // This struct is different, currently it's 1:1 but this might change in the future. | ||
| 890 | enum class NintendoScaleMode : u32 { | ||
| 891 | None = 0, | ||
| 892 | Freeze = 1, | ||
| 893 | ScaleToWindow = 2, | ||
| 894 | Crop = 3, | ||
| 895 | NoCrop = 4, | ||
| 896 | }; | ||
| 897 | |||
| 877 | void GetRelayService(Kernel::HLERequestContext& ctx) { | 898 | void GetRelayService(Kernel::HLERequestContext& ctx) { |
| 878 | LOG_WARNING(Service_VI, "(STUBBED) called"); | 899 | LOG_WARNING(Service_VI, "(STUBBED) called"); |
| 879 | 900 | ||
| @@ -978,13 +999,27 @@ private: | |||
| 978 | 999 | ||
| 979 | void SetLayerScalingMode(Kernel::HLERequestContext& ctx) { | 1000 | void SetLayerScalingMode(Kernel::HLERequestContext& ctx) { |
| 980 | IPC::RequestParser rp{ctx}; | 1001 | IPC::RequestParser rp{ctx}; |
| 981 | const u32 scaling_mode = rp.Pop<u32>(); | 1002 | const auto scaling_mode = rp.PopEnum<NintendoScaleMode>(); |
| 982 | const u64 unknown = rp.Pop<u64>(); | 1003 | const u64 unknown = rp.Pop<u64>(); |
| 983 | 1004 | ||
| 984 | LOG_WARNING(Service_VI, "(STUBBED) called. scaling_mode=0x{:08X}, unknown=0x{:016X}", | 1005 | LOG_DEBUG(Service_VI, "called. scaling_mode=0x{:08X}, unknown=0x{:016X}", |
| 985 | scaling_mode, unknown); | 1006 | static_cast<u32>(scaling_mode), unknown); |
| 986 | 1007 | ||
| 987 | IPC::ResponseBuilder rb{ctx, 2}; | 1008 | IPC::ResponseBuilder rb{ctx, 2}; |
| 1009 | |||
| 1010 | if (scaling_mode > NintendoScaleMode::NoCrop) { | ||
| 1011 | LOG_ERROR(Service_VI, "Invalid scaling mode provided."); | ||
| 1012 | rb.Push(ERR_OPERATION_FAILED); | ||
| 1013 | return; | ||
| 1014 | } | ||
| 1015 | |||
| 1016 | if (scaling_mode != NintendoScaleMode::ScaleToWindow && | ||
| 1017 | scaling_mode != NintendoScaleMode::NoCrop) { | ||
| 1018 | LOG_ERROR(Service_VI, "Unsupported scaling mode supplied."); | ||
| 1019 | rb.Push(ERR_UNSUPPORTED); | ||
| 1020 | return; | ||
| 1021 | } | ||
| 1022 | |||
| 988 | rb.Push(RESULT_SUCCESS); | 1023 | rb.Push(RESULT_SUCCESS); |
| 989 | } | 1024 | } |
| 990 | 1025 | ||
| @@ -1065,24 +1100,6 @@ private: | |||
| 1065 | rb.PushCopyObjects(vsync_event); | 1100 | rb.PushCopyObjects(vsync_event); |
| 1066 | } | 1101 | } |
| 1067 | 1102 | ||
| 1068 | enum class ConvertedScaleMode : u64 { | ||
| 1069 | None = 0, // VI seems to name this as "Unknown" but lots of games pass it, assume it's no | ||
| 1070 | // scaling/default | ||
| 1071 | Freeze = 1, | ||
| 1072 | ScaleToWindow = 2, | ||
| 1073 | Crop = 3, | ||
| 1074 | NoCrop = 4, | ||
| 1075 | }; | ||
| 1076 | |||
| 1077 | // This struct is different, currently it's 1:1 but this might change in the future. | ||
| 1078 | enum class NintendoScaleMode : u32 { | ||
| 1079 | None = 0, | ||
| 1080 | Freeze = 1, | ||
| 1081 | ScaleToWindow = 2, | ||
| 1082 | Crop = 3, | ||
| 1083 | NoCrop = 4, | ||
| 1084 | }; | ||
| 1085 | |||
| 1086 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { | 1103 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { |
| 1087 | IPC::RequestParser rp{ctx}; | 1104 | IPC::RequestParser rp{ctx}; |
| 1088 | auto mode = rp.PopEnum<NintendoScaleMode>(); | 1105 | auto mode = rp.PopEnum<NintendoScaleMode>(); |