diff options
| -rw-r--r-- | src/core/hle/service/vi/vi.cpp | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/src/core/hle/service/vi/vi.cpp b/src/core/hle/service/vi/vi.cpp index bbc02abcc..184537daa 100644 --- a/src/core/hle/service/vi/vi.cpp +++ b/src/core/hle/service/vi/vi.cpp | |||
| @@ -968,6 +968,54 @@ private: | |||
| 968 | rb.PushCopyObjects(vsync_event); | 968 | rb.PushCopyObjects(vsync_event); |
| 969 | } | 969 | } |
| 970 | 970 | ||
| 971 | enum class ConvertedScaleMode : u64 { | ||
| 972 | None = 0, // VI seems to name this as "Unknown" but lots of games pass it, assume it's no | ||
| 973 | // scaling/default | ||
| 974 | Freeze = 1, | ||
| 975 | ScaleToWindow = 2, | ||
| 976 | Crop = 3, | ||
| 977 | NoCrop = 4, | ||
| 978 | }; | ||
| 979 | |||
| 980 | // This struct is different, currently it's 1:1 but this might change in the future. | ||
| 981 | enum class NintendoScaleMode : u32 { | ||
| 982 | None = 0, | ||
| 983 | Freeze = 1, | ||
| 984 | ScaleToWindow = 2, | ||
| 985 | Crop = 3, | ||
| 986 | NoCrop = 4, | ||
| 987 | }; | ||
| 988 | |||
| 989 | void ConvertScalingMode(Kernel::HLERequestContext& ctx) { | ||
| 990 | IPC::RequestParser rp{ctx}; | ||
| 991 | auto mode = rp.PopEnum<NintendoScaleMode>(); | ||
| 992 | LOG_DEBUG(Service_VI, "called mode={}", static_cast<u32>(mode)); | ||
| 993 | |||
| 994 | IPC::ResponseBuilder rb{ctx, 4}; | ||
| 995 | rb.Push(RESULT_SUCCESS); | ||
| 996 | switch (mode) { | ||
| 997 | case NintendoScaleMode::None: | ||
| 998 | rb.PushEnum(ConvertedScaleMode::None); | ||
| 999 | break; | ||
| 1000 | case NintendoScaleMode::Freeze: | ||
| 1001 | rb.PushEnum(ConvertedScaleMode::Freeze); | ||
| 1002 | break; | ||
| 1003 | case NintendoScaleMode::ScaleToWindow: | ||
| 1004 | rb.PushEnum(ConvertedScaleMode::ScaleToWindow); | ||
| 1005 | break; | ||
| 1006 | case NintendoScaleMode::Crop: | ||
| 1007 | rb.PushEnum(ConvertedScaleMode::Crop); | ||
| 1008 | break; | ||
| 1009 | case NintendoScaleMode::NoCrop: | ||
| 1010 | rb.PushEnum(ConvertedScaleMode::NoCrop); | ||
| 1011 | break; | ||
| 1012 | default: | ||
| 1013 | UNIMPLEMENTED_MSG("Unknown scaling mode {}", static_cast<u32>(mode)); | ||
| 1014 | rb.PushEnum(ConvertedScaleMode::None); | ||
| 1015 | break; | ||
| 1016 | } | ||
| 1017 | } | ||
| 1018 | |||
| 971 | std::shared_ptr<NVFlinger::NVFlinger> nv_flinger; | 1019 | std::shared_ptr<NVFlinger::NVFlinger> nv_flinger; |
| 972 | }; | 1020 | }; |
| 973 | 1021 | ||
| @@ -991,7 +1039,7 @@ IApplicationDisplayService::IApplicationDisplayService( | |||
| 991 | {2030, &IApplicationDisplayService::CreateStrayLayer, "CreateStrayLayer"}, | 1039 | {2030, &IApplicationDisplayService::CreateStrayLayer, "CreateStrayLayer"}, |
| 992 | {2031, &IApplicationDisplayService::DestroyStrayLayer, "DestroyStrayLayer"}, | 1040 | {2031, &IApplicationDisplayService::DestroyStrayLayer, "DestroyStrayLayer"}, |
| 993 | {2101, &IApplicationDisplayService::SetLayerScalingMode, "SetLayerScalingMode"}, | 1041 | {2101, &IApplicationDisplayService::SetLayerScalingMode, "SetLayerScalingMode"}, |
| 994 | {2102, nullptr, "ConvertScalingMode"}, | 1042 | {2102, &IApplicationDisplayService::ConvertScalingMode, "ConvertScalingMode"}, |
| 995 | {2450, nullptr, "GetIndirectLayerImageMap"}, | 1043 | {2450, nullptr, "GetIndirectLayerImageMap"}, |
| 996 | {2451, nullptr, "GetIndirectLayerImageCropMap"}, | 1044 | {2451, nullptr, "GetIndirectLayerImageCropMap"}, |
| 997 | {2460, nullptr, "GetIndirectLayerImageRequiredMemoryInfo"}, | 1045 | {2460, nullptr, "GetIndirectLayerImageRequiredMemoryInfo"}, |