RetroPie-Setup/scriptmodules/supplementary/backends.sh
cmitu ac5ec0e5c8 backends: add SDL1.2 Compat backend
Added the SDL12-Compat backend, using a shim library which implements the `sdl1.2` API over SDL2.

The new `sdl12-compat` backend should be used for SDL1 applications when:
 * the platform doesn't have `dispmanx` anymore (e.g. `rpi` platforms with RaspiOS Bullseye and later)
 * `sdl2` has a working accelerated video & rendering drivers
 * not running under `x11` (i.e. KMS)

Note: for SDL1+Videocore specific applications, which use directly the dispmanx/legacy GL stack (e.g. `pcsx-rearmed`, `advmame-1.4`, etc.), the backend will not help.
2024-01-25 19:38:41 +00:00

131 lines
4.3 KiB
Bash

#!/usr/bin/env bash
# This file is part of The RetroPie Project
#
# The RetroPie Project is the legal property of its developers, whose names are
# too numerous to list here. Please refer to the COPYRIGHT.md file distributed with this source.
#
# See the LICENSE.md file at the top-level directory of this distribution and
# at https://raw.githubusercontent.com/RetroPie/RetroPie-Setup/master/LICENSE.md
#
rp_module_id="backends"
rp_module_desc="Configure display/driver backends for emulators"
rp_module_section="config"
rp_module_flags="!mali !x11"
function _list_backends() {
local id="$1"
backends=()
# skip the 'depends' packages
[[ ${__mod_info[$id/section]} == "depends" ]] && return 1
local flags="${__mod_info[$id/flags]}"
local sdl
if isPlatform "videocore" && hasFlag "$flags" "sdl1-videocore"; then
sdl="sdl1"
elif hasFlag "$flags" "sdl1" || hasFlag "$flags" "dispmanx"; then
sdl="sdl1"
elif hasFlag "$flags" "sdl2"; then
sdl="sdl2"
else
return 1
fi
local default
local sdl_name="${sdl^^}"
if [[ "$sdl" == "sdl1" ]]; then
backends["default"]="SDL1 Framebuffer driver"
isPlatform "dispmanx" && backends["dispmanx"]="SDL1 DispmanX driver"
isPlatform "kms" && ! isPlatform "dispmanx" && backends["sdl12-compat"]="SDL1 Compat driver"
elif [[ "$sdl" == "sdl2" ]]; then
if isPlatform "videocore"; then
default="SDL2 videocore driver"
elif isPlatform "kms"; then
default="SDL2 KMS driver"
fi
backends["default"]="$default"
fi
backends["x11"]="$sdl_name on Desktop"
backends["x11-c"]="$sdl_name on Desktop + Cursor"
return 0
}
function _update_hook_backends() {
local dispmanx_cfg="$configdir/all/dispmanx.cfg"
local backends_cfg="$configdir/all/backends.cfg"
if [[ -f "$dispmanx_cfg" ]]; then
mv "$dispmanx_cfg" "$backends_cfg"
fi
}
function gui_backends() {
declare -A backends
local id
local backend
local default
local flags
local valid
while true; do
local options=()
for id in "${__mod_id[@]}"; do
valid=0
if rp_isInstalled "$id"; then
if _list_backends "$id" >/dev/null; then
backend="$(getBackend "$id")"
options+=("$id" "Using ${backends[$backend]} ($backend)")
fi
fi
done
local cmd=(dialog --backtitle "$__backtitle" --default-item "$default" --menu "Configure display/driver backends for emulators" 22 76 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
[[ -z "$choice" ]] && break
default="$choice"
gui_configure_backends "$choice"
done
}
function gui_configure_backends() {
local id="$1"
declare -A backends
_list_backends "$id"
while true; do
local current="$(getBackend "$id")"
local options=()
local selected
local backend
local flags
for backend in $(echo "${!backends[@]}" | xargs -n1 | sort); do
selected=""
[[ "$current" == "$backend" ]] && selected="(Currently selected)"
options+=("$backend" "${backends[$backend]} $selected")
done
local cmd=(dialog --default-item "$current" --backtitle "$__backtitle" --menu "Select backend for $id" 22 76 16)
local choice=$("${cmd[@]}" "${options[@]}" 2>&1 >/dev/tty)
if [[ -n "$choice" ]]; then
if [[ "$choice" == "x11" ]] && ( ! hasPackage "xorg" || ! hasPackage "matchbox-window-manager" ); then
if dialog --defaultno --yesno "To use the X11/Xorg backend, some additional packages are needed (xorg / matchbox-window-manager) - do you want to continue?" 22 76 2>&1 >/dev/tty; then
aptInstall xorg matchbox-window-manager
else
continue
fi
fi
if [[ "$choice" == "sdl12-compat" ]] && ! rp_isInstalled "sdl12-compat"; then
rp_callModule "sdl12-compat" _auto_
fi
local func="_backend_set_$id"
if fnExists "$func"; then
rp_callModule "$id" _backend_set "$choice" 1
else
setBackend "$id" "$choice" 1
fi
fi
break
done
}