diff --git a/documentation/PER_DEVICE_DOCUMENTATION/RK3588/SUPPORTED_EMULATORS_AND_CORES.md b/documentation/PER_DEVICE_DOCUMENTATION/RK3588/SUPPORTED_EMULATORS_AND_CORES.md index 1009820105..bbdb35010b 100644 --- a/documentation/PER_DEVICE_DOCUMENTATION/RK3588/SUPPORTED_EMULATORS_AND_CORES.md +++ b/documentation/PER_DEVICE_DOCUMENTATION/RK3588/SUPPORTED_EMULATORS_AND_CORES.md @@ -70,7 +70,7 @@ This document describes all available systems emulators and cores available for |Nintendo|Game Boy Advance (Hacks) (gbah)|2001|`gbah`|.gba .zip .7z|**retroarch:** mgba (default)
**retroarch:** vbam
**retroarch:** vba_next
**retroarch:** beetle_gba
**mednafen:** gba
| |Nintendo|Game Boy Color (gbc)|1998|`gbc`|.gb .gbc .zip .7z|**retroarch:** gambatte (default)
**retroarch:** sameboy
**retroarch:** gearboy
**retroarch:** tgbdual
**retroarch:** mgba
**retroarch:** vbam
**retroarch:** DoubleCherryGB
**mednafen:** gb
| |Nintendo|Game Boy Color (Hacks) (gbch)|1998|`gbch`|.gb .gbc .zip .7z|**retroarch:** gambatte (default)
**retroarch:** sameboy
**retroarch:** gearboy
**retroarch:** tgbdual
**retroarch:** mgba
**retroarch:** vbam
**retroarch:** DoubleCherryGB
**mednafen:** gb
| -|Nintendo|GameCube (gamecube)|2001|`gamecube`|.gcm .iso .gcz .ciso .wbfs .rvz .dol|**dolphin:** dolphin-sa-gc (default)
**retroarch:** dolphin
| +|Nintendo|GameCube (gamecube)|2001|`gamecube`|.gcm .iso .gcz .ciso .wbfs .rvz .dol|**dolphin:** dolphin-sa-gc
**dolphin:** dolphin-qt-gc (default)
**retroarch:** dolphin
| |Nintendo|NES (Hacks) (nesh)|1985|`nesh`|.nes .unif .unf .zip .7z|**retroarch:** nestopia (default)
**retroarch:** fceumm
**retroarch:** quicknes
**retroarch:** mesen
**mednafen:** nesh
| |Nintendo|Nintendo 3DS (3ds)|2010|`3ds`|.3ds .3dsx .elf .axf .cci .cxi .app|**retroarch:** panda3ds (default)
| |Nintendo|Nintendo 64 (n64)|1996|`n64`|.z64 .n64 .v64 .zip .7z|**retroarch:** mupen64plus_next (default)
**retroarch:** mupen64plus
**retroarch:** parallel_n64
**mupen64plus:** mupen64plus-sa
| @@ -83,7 +83,7 @@ This document describes all available systems emulators and cores available for |Nintendo|Super Nintendo (Hacks) (snesh)|1991|`snesh`|.smc .fig .sfc .swc .zip .7z|**retroarch:** snes9x (default)
**retroarch:** snes9x2010
**retroarch:** snes9x2002
**retroarch:** snes9x2005_plus
**retroarch:** beetle_supafaust
**retroarch:** bsnes_mercury_performance
**retroarch:** bsnes
**retroarch:** bsnes_hd_beta
**mednafen:** snes_faust
| |Nintendo|Super Nintendo (snes)|1991|`snes`|.smc .fig .sfc .swc .zip .7z|**retroarch:** snes9x (default)
**retroarch:** snes9x2010
**retroarch:** snes9x2002
**retroarch:** snes9x2005_plus
**retroarch:** beetle_supafaust
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
**retroarch:** bsnes_mercury_performance
**retroarch:** bsnes
**retroarch:** bsnes_hd_beta
**mednafen:** snes_faust
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
**mednafen:** snes_faust
| |Nintendo|Virtual Boy (virtualboy)|1995|`virtualboy`|.vb .zip .7z|**retroarch:** beetle_vb (default)
**mednafen:** vb
| -|Nintendo|Wii (wii)|2006|`wii`|.gcm .iso .gcz .ciso .wbfs .rvz .dol .wad|**dolphin:** dolphin-sa-wii (default)
**retroarch:** dolphin
| +|Nintendo|Wii (wii)|2006|`wii`|.gcm .iso .gcz .ciso .wbfs .rvz .dol .wad|**dolphin:** dolphin-sa-wii
**dolphin:** dolphin-qt-wii (default)
**retroarch:** dolphin
| |Palm, Inc.|Palm OS (palm)|1996|`palm`|.prc .pqa .img .pdb .zip|**retroarch:** mu (default)
| |Panasonic|3DO (3do)|1993|`3do`|.iso .bin .chd .cue|**retroarch:** opera (default)
| |Philips|CD-i (cdi)|1991|`cdi`|.chd .cue .iso|**retroarch:** same_cdi (default)
| diff --git a/documentation/PER_DEVICE_DOCUMENTATION/S922X/SUPPORTED_EMULATORS_AND_CORES.md b/documentation/PER_DEVICE_DOCUMENTATION/S922X/SUPPORTED_EMULATORS_AND_CORES.md index 3946772daf..620896382b 100644 --- a/documentation/PER_DEVICE_DOCUMENTATION/S922X/SUPPORTED_EMULATORS_AND_CORES.md +++ b/documentation/PER_DEVICE_DOCUMENTATION/S922X/SUPPORTED_EMULATORS_AND_CORES.md @@ -70,7 +70,7 @@ This document describes all available systems emulators and cores available for |Nintendo|Game Boy Advance (Hacks) (gbah)|2001|`gbah`|.gba .zip .7z|**retroarch:** mgba (default)
**retroarch:** vbam
**retroarch:** vba_next
**retroarch:** beetle_gba
| |Nintendo|Game Boy Color (gbc)|1998|`gbc`|.gb .gbc .zip .7z|**retroarch:** gambatte (default)
**retroarch:** sameboy
**retroarch:** gearboy
**retroarch:** tgbdual
**retroarch:** mgba
**retroarch:** vbam
**retroarch:** DoubleCherryGB
| |Nintendo|Game Boy Color (Hacks) (gbch)|1998|`gbch`|.gb .gbc .zip .7z|**retroarch:** gambatte (default)
**retroarch:** sameboy
**retroarch:** gearboy
**retroarch:** tgbdual
**retroarch:** mgba
**retroarch:** vbam
**retroarch:** DoubleCherryGB
| -|Nintendo|GameCube (gamecube)|2001|`gamecube`|.gcm .iso .gcz .ciso .wbfs .rvz .dol|**dolphin:** dolphin-sa-gc (default)
**retroarch:** dolphin
| +|Nintendo|GameCube (gamecube)|2001|`gamecube`|.gcm .iso .gcz .ciso .wbfs .rvz .dol|**dolphin:** dolphin-sa-gc (default)
**dolphin:** dolphin-qt-gc
**retroarch:** dolphin
| |Nintendo|NES (Hacks) (nesh)|1985|`nesh`|.nes .unif .unf .zip .7z|**retroarch:** nestopia (default)
**retroarch:** fceumm
**retroarch:** quicknes
**retroarch:** mesen
| |Nintendo|Nintendo 3DS (3ds)|2010|`3ds`|.3ds .3dsx .elf .axf .cci .cxi .app|**lime3ds:** lime3ds-sa (default)
| |Nintendo|Nintendo 64 (n64)|1996|`n64`|.z64 .n64 .v64 .zip .7z|**retroarch:** mupen64plus_next (default)
**retroarch:** mupen64plus
**retroarch:** parallel_n64
**mupen64plus:** mupen64plus-sa
| @@ -83,7 +83,7 @@ This document describes all available systems emulators and cores available for |Nintendo|Super Nintendo (Hacks) (snesh)|1991|`snesh`|.smc .fig .sfc .swc .zip .7z|**retroarch:** snes9x (default)
**retroarch:** snes9x2010
**retroarch:** snes9x2002
**retroarch:** snes9x2005_plus
**retroarch:** beetle_supafaust
**retroarch:** bsnes_mercury_performance
**retroarch:** bsnes
**retroarch:** bsnes_hd_beta
| |Nintendo|Super Nintendo (snes)|1991|`snes`|.smc .fig .sfc .swc .zip .7z|**retroarch:** snes9x (default)
**retroarch:** snes9x2010
**retroarch:** snes9x2002
**retroarch:** snes9x2005_plus
**retroarch:** beetle_supafaust
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
**retroarch:** bsnes_mercury_performance
**retroarch:** bsnes
**retroarch:** bsnes_hd_beta
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
**retroarch:** bsnes_mercury_accuracy
**retroarch:** bsnes_mercury_balanced
| |Nintendo|Virtual Boy (virtualboy)|1995|`virtualboy`|.vb .zip .7z|**retroarch:** beetle_vb (default)
| -|Nintendo|Wii (wii)|2006|`wii`|.gcm .iso .gcz .ciso .wbfs .rvz .dol .wad|**dolphin:** dolphin-sa-wii (default)
**retroarch:** dolphin
| +|Nintendo|Wii (wii)|2006|`wii`|.gcm .iso .gcz .ciso .wbfs .rvz .dol .wad|**dolphin:** dolphin-sa-wii (default)
**dolphin:** dolphin-qt-gc
**retroarch:** dolphin
| |Palm, Inc.|Palm OS (palm)|1996|`palm`|.prc .pqa .img .pdb .zip|**retroarch:** mu (default)
| |Panasonic|3DO (3do)|1993|`3do`|.iso .bin .chd .cue|**retroarch:** opera (default)
| |Philips|CD-i (cdi)|1991|`cdi`|.chd .cue .iso|**retroarch:** same_cdi (default)
| diff --git a/packages/emulators/standalone/dolphin-sa/config/AMD64/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/AMD64/Dolphin.ini index 7a521d1520..855fa1bf6f 100644 --- a/packages/emulators/standalone/dolphin-sa/config/AMD64/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/AMD64/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 diff --git a/packages/emulators/standalone/dolphin-sa/config/RK3399/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/RK3399/Dolphin.ini index 65c34791f7..fa0ee0197f 100755 --- a/packages/emulators/standalone/dolphin-sa/config/RK3399/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/RK3399/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 diff --git a/packages/emulators/standalone/dolphin-sa/config/RK3566/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/RK3566/Dolphin.ini index 65c34791f7..fa0ee0197f 100755 --- a/packages/emulators/standalone/dolphin-sa/config/RK3566/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/RK3566/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 diff --git a/packages/emulators/standalone/dolphin-sa/config/RK3588/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/RK3588/Dolphin.ini index 92e7f5bbdd..d820b1218c 100644 --- a/packages/emulators/standalone/dolphin-sa/config/RK3588/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/RK3588/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 @@ -77,7 +78,7 @@ Fastmem = True CPUThread = True DSPHLE = True SkipIdle = True -SyncOnSkipIdle = True +SyncOnSkipIdle = False SyncGPU = False SyncGpuMaxDistance = 200000 SyncGpuMinDistance = -200000 @@ -120,9 +121,9 @@ RunCompareServer = False RunCompareClient = False EmulationSpeed = 1.00000000 FrameSkip = 0x00000003 -Overclock = 4.00000000 +Overclock = 1.0 OverclockEnable = False -GFXBackend = OGL +GFXBackend = Vulkan GPUDeterminismMode = auto PerfMapDir = [Movie] @@ -138,6 +139,7 @@ DumpUCode = False Backend = Pulse Volume = 100 CaptureLog = False +DSPThread = True [Input] BackgroundInput = False [FifoPlayer] diff --git a/packages/emulators/standalone/dolphin-sa/config/RK3588/Hotkeys.ini b/packages/emulators/standalone/dolphin-sa/config/RK3588/Hotkeys.ini new file mode 100644 index 0000000000..838c89f486 --- /dev/null +++ b/packages/emulators/standalone/dolphin-sa/config/RK3588/Hotkeys.ini @@ -0,0 +1,10 @@ +[Hotkeys] +Device = evdev/0/Microsoft X-Box 360 pad +Graphics Toggles/Toggle Aspect Ratio = @(MODE+EAST) +General/Take Screenshot = @(MODE+SOUTH) +Save State/Save to Selected Slot = @(MODE+TR) +Load State/Load State Slot 1 = @(MODE+TL) +Other State Hotkeys/Increase Selected State Slot = @(MODE+`Axis 7-`) +Other State Hotkeys/Decrease Selected State Slot = @(MODE+`Axis 7+`) +Emulation Speed/Increase Emulation Speed = @(MODE+`Full Axis 5+`) +Emulation Speed/Decrease Emulation Speed = @(MODE+`Full Axis 2+`) diff --git a/packages/emulators/standalone/dolphin-sa/config/S922X/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/S922X/Dolphin.ini index b6830af12e..d820b1218c 100644 --- a/packages/emulators/standalone/dolphin-sa/config/S922X/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/S922X/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 diff --git a/packages/emulators/standalone/dolphin-sa/config/S922X/Hotkeys.ini b/packages/emulators/standalone/dolphin-sa/config/S922X/Hotkeys.ini new file mode 100644 index 0000000000..838c89f486 --- /dev/null +++ b/packages/emulators/standalone/dolphin-sa/config/S922X/Hotkeys.ini @@ -0,0 +1,10 @@ +[Hotkeys] +Device = evdev/0/Microsoft X-Box 360 pad +Graphics Toggles/Toggle Aspect Ratio = @(MODE+EAST) +General/Take Screenshot = @(MODE+SOUTH) +Save State/Save to Selected Slot = @(MODE+TR) +Load State/Load State Slot 1 = @(MODE+TL) +Other State Hotkeys/Increase Selected State Slot = @(MODE+`Axis 7-`) +Other State Hotkeys/Decrease Selected State Slot = @(MODE+`Axis 7+`) +Emulation Speed/Increase Emulation Speed = @(MODE+`Full Axis 5+`) +Emulation Speed/Decrease Emulation Speed = @(MODE+`Full Axis 2+`) diff --git a/packages/emulators/standalone/dolphin-sa/config/SD865/Dolphin.ini b/packages/emulators/standalone/dolphin-sa/config/SD865/Dolphin.ini index b6830af12e..d820b1218c 100644 --- a/packages/emulators/standalone/dolphin-sa/config/SD865/Dolphin.ini +++ b/packages/emulators/standalone/dolphin-sa/config/SD865/Dolphin.ini @@ -70,6 +70,7 @@ ColumnRegion = True ColumnSize = True ColumnState = True [Core] +SkipIPL = True HLE_BS2 = False TimingVariance = 40 CPUCore = 4 diff --git a/packages/emulators/standalone/dolphin-sa/package.mk b/packages/emulators/standalone/dolphin-sa/package.mk index cf5539b6e5..8ff265ab15 100644 --- a/packages/emulators/standalone/dolphin-sa/package.mk +++ b/packages/emulators/standalone/dolphin-sa/package.mk @@ -9,7 +9,16 @@ PKG_LONGDESC="Dolphin is a GameCube / Wii emulator, allowing you to play games f PKG_TOOLCHAIN="cmake" case ${DEVICE} in - SD865|AMD64|RK3399) + RK3566) + PKG_SITE="https://github.com/dolphin-emu/dolphin" + PKG_URL="${PKG_SITE}.git" + PKG_VERSION="e6583f8bec814d8f3748f1d7738457600ce0de56" + PKG_PATCH_DIRS+=" wayland" + PKG_CMAKE_OPTS_TARGET+=" -DENABLE_QT=OFF \ + -DUSE_RETRO_ACHIEVEMENTS=OFF \ + -DENABLE_HEADLESS=ON" + ;; + *) PKG_VERSION="8c3b9c9cf6a4c40e773c5b13ed4dc7ea1912d05b" PKG_SITE="https://github.com/dolphin-emu/dolphin" PKG_URL="${PKG_SITE}.git" @@ -19,15 +28,6 @@ case ${DEVICE} in -DUSE_RETRO_ACHIEVEMENTS=ON \ -DENABLE_HEADLESS=OFF" ;; - *) - PKG_SITE="https://github.com/dolphin-emu/dolphin" - PKG_URL="${PKG_SITE}.git" - PKG_VERSION="e6583f8bec814d8f3748f1d7738457600ce0de56" - PKG_PATCH_DIRS+=" wayland" - PKG_CMAKE_OPTS_TARGET+=" -DENABLE_QT=OFF \ - -DUSE_RETRO_ACHIEVEMENTS=OFF \ - -DENABLE_HEADLESS=ON" - ;; esac if [ "${OPENGL_SUPPORT}" = "yes" ]; then @@ -89,17 +89,11 @@ makeinstall_target() { post_install() { case ${DEVICE} in - RK3588) - DOLPHIN_PLATFORM="\${PLATFORM}" - EXPORTS="if [ ! -z 'lsmod | grep panthor' ]; then LD_LIBRARY_PATH='\/usr\/lib\/libmali-valhall-g610-g13p0-x11-gbm.so' PLATFORM='wayland'; else PLATFORM='x11'; fi" - ;; - SD865|AMD64|RK3399) - DOLPHIN_PLATFORM="x11" - EXPORTS="export QT_QPA_PLATFORM=xcb" + RK3566) + DOLPHIN_PLATFORM="wayland" ;; *) - DOLPHIN_PLATFORM="wayland" - EXPORTS="" + DOLPHIN_PLATFORM="x11" ;; esac sed -e "s/@DOLPHIN_PLATFORM@/${DOLPHIN_PLATFORM}/g" -i ${INSTALL}/usr/bin/start_dolphin_gc.sh diff --git a/packages/emulators/standalone/dolphin-sa/patches/qt6/007-qt-vulkan-wayland-support.patch b/packages/emulators/standalone/dolphin-sa/patches/qt6/007-qt-vulkan-wayland-support.patch new file mode 100644 index 0000000000..74f0b8c8cf --- /dev/null +++ b/packages/emulators/standalone/dolphin-sa/patches/qt6/007-qt-vulkan-wayland-support.patch @@ -0,0 +1,387 @@ +commit 33363780457605f47a306e3b0849dcae15276eb3 +Author: Artemis Tosini +Date: Mon Apr 6 19:47:13 2020 +0000 + + DolphinQt: Add support for Vulkan on Wayland + + Currently, Linux users of DolphinQt can only use the X11 windowing + system. This commit adds support for running on top of Wayland, which + some compositors require in order to access full resolution on HiDPI + displays (such as sway). This uses the Vulkan ICD to get a Vulkan + surface, though does not support using wayland-egl to get an EGL + surface or software rendering to a native Wayland surface. + + This commit does not set Wayland as the default backend when it is availaible. + Users who want to use it must set -DENABLE_WAYLAND=ON when compiling Dolphin + and run Dolphin with QT_QPA_PLATFORM=wayland. + +diff --git a/CMake/FindWayland.cmake b/CMake/FindWayland.cmake +new file mode 100644 +index 0000000000..f93218b873 +--- /dev/null ++++ b/CMake/FindWayland.cmake +@@ -0,0 +1,66 @@ ++# Try to find Wayland on a Unix system ++# ++# This will define: ++# ++# WAYLAND_FOUND - True if Wayland is found ++# WAYLAND_LIBRARIES - Link these to use Wayland ++# WAYLAND_INCLUDE_DIR - Include directory for Wayland ++# WAYLAND_DEFINITIONS - Compiler flags for using Wayland ++# ++# In addition the following more fine grained variables will be defined: ++# ++# WAYLAND_CLIENT_FOUND WAYLAND_CLIENT_INCLUDE_DIR WAYLAND_CLIENT_LIBRARIES ++# WAYLAND_SERVER_FOUND WAYLAND_SERVER_INCLUDE_DIR WAYLAND_SERVER_LIBRARIES ++# WAYLAND_EGL_FOUND WAYLAND_EGL_INCLUDE_DIR WAYLAND_EGL_LIBRARIES ++# ++# Copyright (c) 2013 Martin Gräßlin ++# ++# Redistribution and use is allowed according to the terms of the BSD license. ++# For details see the accompanying COPYING-CMAKE-SCRIPTS file. ++ ++IF (NOT WIN32) ++ IF (WAYLAND_INCLUDE_DIR AND WAYLAND_LIBRARIES) ++ # In the cache already ++ SET(WAYLAND_FIND_QUIETLY TRUE) ++ ENDIF () ++ ++ # Use pkg-config to get the directories and then use these values ++ # in the FIND_PATH() and FIND_LIBRARY() calls ++ FIND_PACKAGE(PkgConfig) ++ PKG_CHECK_MODULES(PKG_WAYLAND QUIET wayland-client wayland-server wayland-egl wayland-cursor) ++ ++ SET(WAYLAND_DEFINITIONS ${PKG_WAYLAND_CFLAGS}) ++ ++ FIND_PATH(WAYLAND_CLIENT_INCLUDE_DIR NAMES wayland-client.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) ++ FIND_PATH(WAYLAND_SERVER_INCLUDE_DIR NAMES wayland-server.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) ++ FIND_PATH(WAYLAND_EGL_INCLUDE_DIR NAMES wayland-egl.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) ++ FIND_PATH(WAYLAND_CURSOR_INCLUDE_DIR NAMES wayland-cursor.h HINTS ${PKG_WAYLAND_INCLUDE_DIRS}) ++ ++ FIND_LIBRARY(WAYLAND_CLIENT_LIBRARIES NAMES wayland-client HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) ++ FIND_LIBRARY(WAYLAND_SERVER_LIBRARIES NAMES wayland-server HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) ++ FIND_LIBRARY(WAYLAND_EGL_LIBRARIES NAMES wayland-egl HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) ++ FIND_LIBRARY(WAYLAND_CURSOR_LIBRARIES NAMES wayland-cursor HINTS ${PKG_WAYLAND_LIBRARY_DIRS}) ++ ++ set(WAYLAND_INCLUDE_DIR ${WAYLAND_CLIENT_INCLUDE_DIR} ${WAYLAND_SERVER_INCLUDE_DIR} ${WAYLAND_EGL_INCLUDE_DIR} ${WAYLAND_CURSOR_INCLUDE_DIR}) ++ ++ set(WAYLAND_LIBRARIES ${WAYLAND_CLIENT_LIBRARIES} ${WAYLAND_SERVER_LIBRARIES} ${WAYLAND_EGL_LIBRARIES} ${WAYLAND_CURSOR_LIBRARIES}) ++ ++ list(REMOVE_DUPLICATES WAYLAND_INCLUDE_DIR) ++ ++ include(FindPackageHandleStandardArgs) ++ ++ FIND_PACKAGE_HANDLE_STANDARD_ARGS(WAYLAND_CLIENT DEFAULT_MSG WAYLAND_CLIENT_LIBRARIES WAYLAND_CLIENT_INCLUDE_DIR) ++ FIND_PACKAGE_HANDLE_STANDARD_ARGS(WAYLAND_SERVER DEFAULT_MSG WAYLAND_SERVER_LIBRARIES WAYLAND_SERVER_INCLUDE_DIR) ++ FIND_PACKAGE_HANDLE_STANDARD_ARGS(WAYLAND_EGL DEFAULT_MSG WAYLAND_EGL_LIBRARIES WAYLAND_EGL_INCLUDE_DIR) ++ FIND_PACKAGE_HANDLE_STANDARD_ARGS(WAYLAND_CURSOR DEFAULT_MSG WAYLAND_CURSOR_LIBRARIES WAYLAND_CURSOR_INCLUDE_DIR) ++ FIND_PACKAGE_HANDLE_STANDARD_ARGS(WAYLAND DEFAULT_MSG WAYLAND_LIBRARIES WAYLAND_INCLUDE_DIR) ++ ++ MARK_AS_ADVANCED( ++ WAYLAND_INCLUDE_DIR WAYLAND_LIBRARIES ++ WAYLAND_CLIENT_INCLUDE_DIR WAYLAND_CLIENT_LIBRARIES ++ WAYLAND_SERVER_INCLUDE_DIR WAYLAND_SERVER_LIBRARIES ++ WAYLAND_EGL_INCLUDE_DIR WAYLAND_EGL_LIBRARIES ++ WAYLAND_CURSOR_INCLUDE_DIR WAYLAND_CURSOR_LIBRARIES ++ ) ++ ++ENDIF () +diff --git a/CMakeLists.txt b/CMakeLists.txt +index 799ddcb238..7bf4766dcb 100644 +--- a/CMakeLists.txt ++++ b/CMakeLists.txt +@@ -43,6 +43,7 @@ set(DOLPHIN_DEFAULT_UPDATE_TRACK "" CACHE STRING "Name of the default update tra + + if(UNIX AND NOT APPLE AND NOT ANDROID) + option(ENABLE_X11 "Enables X11 Support" ON) ++ option(ENABLE_WAYLAND "Enables Wayland Support" OFF) + endif() + if(NOT WIN32 AND NOT APPLE AND NOT HAIKU) + option(ENABLE_EGL "Enables EGL OpenGL Interface" ON) +@@ -549,6 +550,17 @@ if(ENABLE_X11) + endif() + endif() + ++if(ENABLE_WAYLAND) ++ find_package(Wayland) ++ if(WAYLAND_FOUND) ++ add_definitions(-DHAVE_WAYLAND=1) ++ message(STATUS "Wayland support enabled") ++ else() ++ message(WARNING "Wayland support enabled but not found. This build will not support Wayland.") ++ endif() ++endif() ++ ++ + if(ENABLE_EGL) + find_package(EGL) + if(EGL_FOUND) +diff --git a/Source/Core/Common/WindowSystemInfo.h b/Source/Core/Common/WindowSystemInfo.h +index 8936ad1a02..604e963ab5 100644 +--- a/Source/Core/Common/WindowSystemInfo.h ++++ b/Source/Core/Common/WindowSystemInfo.h +@@ -19,9 +19,9 @@ struct WindowSystemInfo + { + WindowSystemInfo() = default; + WindowSystemInfo(WindowSystemType type_, void* display_connection_, void* render_window_, +- void* render_surface_) ++ void* render_surface_, int width_, int height_) + : type(type_), display_connection(display_connection_), render_window(render_window_), +- render_surface(render_surface_) ++ render_surface(render_surface_), width(width_), height(height_) + { + } + +@@ -41,6 +41,12 @@ struct WindowSystemInfo + // during video backend startup the surface pointer may change (MoltenVK). + void* render_surface = nullptr; + ++ // Width and height of the render surface. This is necessary on Wayland as ++ // vkGetPhysicalDeviceSurfaceCapabilitiesKHR does not return the size of ++ // the VkSurfaceKHR created with vkCreateWaylandSurfaceKHR ++ int width = -1; ++ int height = -1; ++ + // Scale of the render surface. For hidpi systems, this will be >1. + float render_surface_scale = 1.0f; + }; +diff --git a/Source/Core/DolphinQt/MainWindow.cpp b/Source/Core/DolphinQt/MainWindow.cpp +index 93ad16a59e..8af38d9d4f 100644 +--- a/Source/Core/DolphinQt/MainWindow.cpp ++++ b/Source/Core/DolphinQt/MainWindow.cpp +@@ -196,7 +196,12 @@ static WindowSystemInfo GetWindowSystemInfo(QWindow* window) + QPlatformNativeInterface* pni = QGuiApplication::platformNativeInterface(); + wsi.display_connection = pni->nativeResourceForWindow("display", window); + if (wsi.type == WindowSystemType::Wayland) ++ { + wsi.render_window = window ? pni->nativeResourceForWindow("surface", window) : nullptr; ++ QSize size = window->size(); ++ wsi.width = size.width(); ++ wsi.height = size.height(); ++ } + else + wsi.render_window = window ? reinterpret_cast(window->winId()) : nullptr; + wsi.render_surface = wsi.render_window; +@@ -1343,8 +1348,13 @@ void MainWindow::ShowGraphicsWindow() + static_cast(QGuiApplication::platformNativeInterface()->nativeResourceForWindow( + "display", windowHandle())), + winId()); ++ m_graphics_window = new GraphicsWindow(this); + } ++ else + #endif ++ { ++ m_graphics_window = new GraphicsWindow(this); ++ } + m_graphics_window = new GraphicsWindow(this); + InstallHotkeyFilter(m_graphics_window); + } +diff --git a/Source/Core/VideoBackends/OGL/CMakeLists.txt b/Source/Core/VideoBackends/OGL/CMakeLists.txt +index 30c4f98ba2..8f07b08e11 100644 +--- a/Source/Core/VideoBackends/OGL/CMakeLists.txt ++++ b/Source/Core/VideoBackends/OGL/CMakeLists.txt +@@ -29,7 +29,11 @@ add_library(videoogl + + target_link_libraries(videoogl PUBLIC common videocommon) + if(X11_FOUND) +- target_link_libraries(videoogl PRIVATE PkgConfig::X11) ++ target_link_libraries(videoogl PRIVATE PkgConfig::X11) ++endif() ++ ++if(WAYLAND_FOUND) ++ target_link_libraries(videoogl PRIVATE ${WAYLAND_LIBRARIES}) + endif() + + if(MSVC) +diff --git a/Source/Core/VideoBackends/Vulkan/VKSwapChain.cpp b/Source/Core/VideoBackends/Vulkan/VKSwapChain.cpp +index 1005cc034a..9c1fe74b49 100644 +--- a/Source/Core/VideoBackends/Vulkan/VKSwapChain.cpp ++++ b/Source/Core/VideoBackends/Vulkan/VKSwapChain.cpp +@@ -21,6 +21,10 @@ + #include + #endif + ++#if defined(VK_USE_PLATFORM_WAYLAND_KHR) ++#include ++#endif ++ + namespace Vulkan + { + SwapChain::SwapChain(const WindowSystemInfo& wsi, VkSurfaceKHR surface, bool vsync) +@@ -84,6 +88,29 @@ VkSurfaceKHR SwapChain::CreateVulkanSurface(VkInstance instance, const WindowSys + } + #endif + ++#if defined(VK_USE_PLATFORM_WAYLAND_KHR) ++ if (wsi.type == WindowSystemType::Wayland) ++ { ++ VkWaylandSurfaceCreateInfoKHR surface_create_info = { ++ VK_STRUCTURE_TYPE_WAYLAND_SURFACE_CREATE_INFO_KHR, // VkStructureType sType ++ nullptr, // const void* pNext ++ 0, // VkWaylandSurfaceCreateFlagsKHR flags ++ static_cast(wsi.display_connection), // struct wl_display* display ++ static_cast(wsi.render_surface) // struct wl_surface* surface ++ }; ++ ++ VkSurfaceKHR surface; ++ VkResult res = vkCreateWaylandSurfaceKHR(instance, &surface_create_info, nullptr, &surface); ++ if (res != VK_SUCCESS) ++ { ++ LOG_VULKAN_ERROR(res, "vkCreateWaylandSurfaceKHR failed: "); ++ return VK_NULL_HANDLE; ++ } ++ ++ return surface; ++ } ++#endif ++ + #if defined(VK_USE_PLATFORM_ANDROID_KHR) + if (wsi.type == WindowSystemType::Android) + { +@@ -302,7 +329,12 @@ bool SwapChain::CreateSwapChain() + // Determine the dimensions of the swap chain. Values of -1 indicate the size we specify here + // determines window size? + VkExtent2D size = surface_capabilities.currentExtent; +- if (size.width == UINT32_MAX) ++ if (size.width == UINT32_MAX && m_wsi.type == WindowSystemType::Wayland) ++ { ++ size.width = m_wsi.width; ++ size.height = m_wsi.height; ++ } ++ else if (size.width == UINT32_MAX) + { + size.width = std::max(g_presenter->GetBackbufferWidth(), 1); + size.height = std::max(g_presenter->GetBackbufferHeight(), 1); +diff --git a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +index ed2407775a..504e347c90 100644 +--- a/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp ++++ b/Source/Core/VideoBackends/Vulkan/VulkanContext.cpp +@@ -373,6 +373,13 @@ bool VulkanContext::SelectInstanceExtensions(std::vector* extension + return false; + } + #endif ++#if defined(VK_USE_PLATFORM_WAYLAND_KHR) ++ if (wstype == WindowSystemType::Wayland && ++ !AddExtension(VK_KHR_WAYLAND_SURFACE_EXTENSION_NAME, true)) ++ { ++ return false; ++ } ++#endif + #if defined(VK_USE_PLATFORM_ANDROID_KHR) + if (wstype == WindowSystemType::Android && + !AddExtension(VK_KHR_ANDROID_SURFACE_EXTENSION_NAME, true)) +diff --git a/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl b/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl +index d716ce49d2..c262a345b1 100644 +--- a/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl ++++ b/Source/Core/VideoBackends/Vulkan/VulkanEntryPoints.inl +@@ -49,6 +49,11 @@ VULKAN_INSTANCE_ENTRY_POINT(vkCreateXlibSurfaceKHR, false) + VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceXlibPresentationSupportKHR, false) + #endif + ++#if defined(VK_USE_PLATFORM_WAYLAND_KHR) ++VULKAN_INSTANCE_ENTRY_POINT(vkCreateWaylandSurfaceKHR, false) ++VULKAN_INSTANCE_ENTRY_POINT(vkGetPhysicalDeviceWaylandPresentationSupportKHR, false) ++#endif ++ + #if defined(VK_USE_PLATFORM_ANDROID_KHR) + VULKAN_INSTANCE_ENTRY_POINT(vkCreateAndroidSurfaceKHR, false) + #endif +index c9b92f5ac8..a728d25186 100644 +--- a/Source/Core/VideoBackends/Vulkan/VulkanLoader.h ++++ b/Source/Core/VideoBackends/Vulkan/VulkanLoader.h +@@ -13,6 +13,10 @@ + #define VK_USE_PLATFORM_XLIB_KHR + #endif + ++#if defined(HAVE_WAYLAND) ++#define VK_USE_PLATFORM_WAYLAND_KHR ++#endif ++ + #if defined(ANDROID) + #define VK_USE_PLATFORM_ANDROID_KHR + #endif +diff --git a/Source/Core/DolphinQt/Host.cpp b/Source/Core/DolphinQt/Host.cpp +index a81924cfd8..a68ca354d8 100644 +--- a/Source/Core/DolphinQt/Host.cpp ++++ b/Source/Core/DolphinQt/Host.cpp +@@ -190,7 +190,7 @@ void Host::SetTASInputFocus(const bool focus) + void Host::ResizeSurface(int new_width, int new_height) + { + if (g_presenter) +- g_presenter->ResizeSurface(); ++ g_presenter->ResizeSurface(new_width, new_height); + } + + std::vector Host_GetPreferredLocales() +diff --git a/Source/Core/VideoBackends/Vulkan/VKGfx.cpp b/Source/Core/VideoBackends/Vulkan/VKGfx.cpp +index d65a5d4680..e21b60b9b4 100644 +--- a/Source/Core/VideoBackends/Vulkan/VKGfx.cpp ++++ b/Source/Core/VideoBackends/Vulkan/VKGfx.cpp +@@ -400,6 +400,7 @@ void VKGfx::CheckForSurfaceResize() + g_command_buffer_mgr->CheckLastPresentFail(); + + // Resize the swap chain. ++ m_swap_chain->UpdateSize(g_presenter->m_new_width, g_presenter->m_new_height); + m_swap_chain->RecreateSwapChain(); + OnSwapChainResized(); + } +diff --git a/Source/Core/VideoBackends/Vulkan/VKSwapChain.h b/Source/Core/VideoBackends/Vulkan/VKSwapChain.h +index 5f173185a0..b979453f25 100644 +--- a/Source/Core/VideoBackends/Vulkan/VKSwapChain.h ++++ b/Source/Core/VideoBackends/Vulkan/VKSwapChain.h +@@ -53,6 +53,12 @@ public: + } + VkResult AcquireNextImage(); + ++ void UpdateSize(int width, int height) ++ { ++ m_wsi.width = width; ++ m_wsi.height = height; ++ } ++ + bool RecreateSurface(void* native_handle); + bool ResizeSwapChain(); + bool RecreateSwapChain(); +diff --git a/Source/Core/VideoCommon/Present.cpp b/Source/Core/VideoCommon/Present.cpp +index 6813c7a4e3..5e60da81e9 100644 +--- a/Source/Core/VideoCommon/Present.cpp ++++ b/Source/Core/VideoCommon/Present.cpp +@@ -509,9 +509,11 @@ void Presenter::ChangeSurface(void* new_surface_handle) + m_surface_changed.Set(); + } + +-void Presenter::ResizeSurface() ++void Presenter::ResizeSurface(int width, int height) + { + std::lock_guard lock(m_swap_mutex); ++ m_new_width = width; ++ m_new_height = height; + m_surface_resized.Set(); + } + +diff --git a/Source/Core/VideoCommon/Present.h b/Source/Core/VideoCommon/Present.h +index 3f8f43a687..4885197f04 100644 +--- a/Source/Core/VideoCommon/Present.h ++++ b/Source/Core/VideoCommon/Present.h +@@ -81,7 +81,8 @@ public: + // Final surface changing + // This is called when the surface is resized (WX) or the window changes (Android). + void ChangeSurface(void* new_surface_handle); +- void ResizeSurface(); ++ void ResizeSurface(int width, int height); ++ void ResizeSurface() { ResizeSurface(-1, -1); } + bool SurfaceResizedTestAndClear() { return m_surface_resized.TestAndClear(); } + bool SurfaceChangedTestAndClear() { return m_surface_changed.TestAndClear(); } + void* GetNewSurfaceHandle(); +@@ -98,6 +99,10 @@ public: + + const MathUtil::Rectangle& GetTargetRectangle() const { return m_target_rectangle; } + ++ // Set when we receive a window resize event. Useful on Wayland ++ int m_new_width = -1; ++ int m_new_height = -1; ++ + private: + // Fetches the XFB texture from the texture cache. + // Returns true the contents have changed since last time diff --git a/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_gc.sh b/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_gc.sh index 8e26d0edb1..1afed7ae47 100644 --- a/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_gc.sh +++ b/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_gc.sh @@ -56,6 +56,15 @@ fi rm -rf /storage/.config/dolphin-emu/StateSaves ln -sf /storage/roms/savestates/gamecube /storage/.config/dolphin-emu/StateSaves +#Link and copy bios and other system stuff to roms +if [ ! -d "/storage/roms/bios/GC/" ]; then + mkdir -p "/storage/roms/bios/GC/" + cp -r /storage/.config/dolphin-emu/GC /storage/roms/bios/ +fi + +rm -rf /storage/.config/dolphin-emu/GC +ln -sf /storage/roms/bios/GC /storage/.config/dolphin-emu/GC + #Grab a clean settings file during boot cp -r /usr/config/dolphin-emu/GFX.ini /storage/.config/dolphin-emu.GFX.ini cp -r /usr/config/dolphin-emu/Dolphin.ini /storage/.config/dolphin-emu.Dolphin.ini @@ -75,6 +84,7 @@ HKEY=$(get_setting hotkey_enable_button "${PLATFORM}" "${GAME}") SHADERM=$(get_setting shader_mode "${PLATFORM}" "${GAME}") SHADERP=$(get_setting shader_precompile "${PLATFORM}" "${GAME}") VSYNC=$(get_setting vsync "${PLATFORM}" "${GAME}") +SKIPBIOS=$(get_setting use_bios "${PLATFORM}" "${GAME}") #Set the cores to use CORES=$(get_setting "cores" "${PLATFORM}" "${GAME}") @@ -89,6 +99,9 @@ else unset EMUPERF fi +# Default to X, set to wayland where supported +export QT_QPA_PLATFORM=xcb + #Anti-Aliasing if [ "$AA" = "0" ] then @@ -185,6 +198,10 @@ fi if [ "$RENDERER" = "vulkan" ] then sed -i '/GFXBackend/c\GFXBackend = Vulkan' /storage/.config/dolphin-emu/Dolphin.ini + # Use wayland when QT and vulkan is selected + if [ ${DOLPHIN_CORE} = "dolphin-emu" ]; then + export QT_QPA_PLATFORM=wayland + fi else sed -i '/GFXBackend/c\GFXBackend = OGL' /storage/.config/dolphin-emu/Dolphin.ini fi @@ -251,6 +268,14 @@ fi sed -i '/ShowFPS/c\ShowFPS = true' /storage/.config/dolphin-emu/GFX.ini fi + #Skip Bios + if [ "$SKIPBIOS" = "false" ] + then + sed -i '/SkipIPL/c\SkipIPL = False' /storage/.config/dolphin-emu/Dolphin.ini + else + sed -i '/SkipIPL/c\SkipIPL = True' /storage/.config/dolphin-emu/Dolphin.ini + fi + #GC Controller Profile if [ "$CON" = "south" ] then @@ -287,11 +312,18 @@ fi rm -rf /storage/.local/share/dolphin-emu ln -sf /storage/.config/dolphin-emu /storage/.local/share/dolphin-emu -@EXPORTS@ #Retroachievements /usr/bin/cheevos_dolphin.sh +# Libmali exception +if [ "$(/usr/bin/gpudriver)" = "libmali" ] && [ "${HW_DEVICE}" != "RK3566" ]; then + export QT_QPA_PLATFORM=wayland + # Force only working combo for libmali: QT + Vulkan + DOLPHIN_CORE=dolphin-emu + sed -i '/GFXBackend/c\GFXBackend = Vulkan' /storage/.config/dolphin-emu/Dolphin.ini +fi + #Run commands if [ ${DOLPHIN_CORE} = "dolphin-emu" ]; then CMD="-b -a ${AUDIO_BACKEND}" diff --git a/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_wii.sh b/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_wii.sh index 7e4d056dd0..eba1dcb302 100755 --- a/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_wii.sh +++ b/packages/emulators/standalone/dolphin-sa/scripts/start_dolphin_wii.sh @@ -92,6 +92,9 @@ else unset EMUPERF fi +# Default to X, set to wayland where supported +export QT_QPA_PLATFORM=xcb + #Anti-Aliasing if [ "$AA" = "0" ] then @@ -187,9 +190,13 @@ fi #Video Backend if [ "$RENDERER" = "vulkan" ] then - sed -i '/GFXBackend/c\GFXBackend = Vulkan' /storage/.config/dolphin-emu/Dolphin.ini + sed -i '/GFXBackend/c\GFXBackend = Vulkan' /storage/.config/dolphin-emu/Dolphin.ini + # Use wayland when QT and vulkan is selected + if [ ${DOLPHIN_CORE} = "dolphin-emu" ]; then + export QT_QPA_PLATFORM=wayland + fi else - sed -i '/GFXBackend/c\GFXBackend = OGL' /storage/.config/dolphin-emu/Dolphin.ini + sed -i '/GFXBackend/c\GFXBackend = OGL' /storage/.config/dolphin-emu/Dolphin.ini fi @@ -291,15 +298,25 @@ fi sed -i '/VSync =/c\VSync = True' /storage/.config/dolphin-emu/GFX.ini fi +# Skip bios always, it's untested for Wii +sed -i '/SkipIPL/c\SkipIPL = True' /storage/.config/dolphin-emu/Dolphin.ini + #Link .config/dolphin-emu to .local rm -rf /storage/.local/share/dolphin-emu ln -sf /storage/.config/dolphin-emu /storage/.local/share/dolphin-emu -@EXPORTS@ #Retroachievements /usr/bin/cheevos_dolphin.sh +# Libmali exception +if [ "$(/usr/bin/gpudriver)" = "libmali" ] && [ "${HW_DEVICE}" != "RK3566" ]; then + export QT_QPA_PLATFORM=wayland + # Force only working combo for libmali: QT + Vulkan + DOLPHIN_CORE=dolphin-emu + sed -i '/GFXBackend/c\GFXBackend = Vulkan' /storage/.config/dolphin-emu/Dolphin.ini +fi + #Run commands if [ ${DOLPHIN_CORE} = "dolphin-emu" ]; then CMD="-b -a ${AUDIO_BACKEND}" diff --git a/packages/emulators/standalone/drastic-sa/package.mk b/packages/emulators/standalone/drastic-sa/package.mk index 147be2537f..b57bcfd08e 100644 --- a/packages/emulators/standalone/drastic-sa/package.mk +++ b/packages/emulators/standalone/drastic-sa/package.mk @@ -5,7 +5,7 @@ PKG_NAME="drastic-sa" PKG_VERSION="1.0" PKG_LICENSE="Proprietary:DRASTIC.pdf" PKG_ARCH="aarch64" -PKG_URL="https://github.com/r3claimer/JelosAddOns/raw/main/drastic.tar.gz" +PKG_URL="https://github.com/ROCKNIX/packages/raw/main/drastic.tar.gz" PKG_DEPENDS_TARGET="toolchain rocknix-hotkey" PKG_LONGDESC="Install Drastic Launcher script, will dowload bin on first run" PKG_TOOLCHAIN="make" diff --git a/packages/graphics/vulkan/vulkan-wsi-layer/package.mk b/packages/graphics/vulkan/vulkan-wsi-layer/package.mk index d7b341cde1..632c37d21d 100644 --- a/packages/graphics/vulkan/vulkan-wsi-layer/package.mk +++ b/packages/graphics/vulkan/vulkan-wsi-layer/package.mk @@ -2,29 +2,34 @@ # Copyright (C) 2024-present ROCKNIX (https://github.com/ROCKNIX) PKG_NAME="vulkan-wsi-layer" -#PKG_VERSION="r51p0-00eac0" -PKG_VERSION="7e27d1d7" +PKG_VERSION="cb1a50cf7e640ad7306e673131ded98c0f133628" PKG_LICENSE="MIT" PKG_SITE="https://gitlab.freedesktop.org/mesa/vulkan-wsi-layer" -PKG_URL="${PKG_SITE}.git" -#PKG_URL="https://developer.arm.com/-/media/Files/downloads/mali-drivers/WSI-Layer/VX501X08X-SW-99009-${PKG_VERSION}.tar.gz" -PKG_DEPENDS_TARGET="toolchain" +PKG_URL="${PKG_SITE}/-/archive/${PKG_VERSION}.tar.gz" +PKG_DEPENDS_TARGET="toolchain vulkan-loader vulkan-headers" PKG_LONGDESC="Implements Vulkan extensions for Window System Integration inside a Vulkan layer." PKG_TOOLCHAIN="cmake" pre_configure_target() { -#PKG_CMAKE_SCRIPT=${PKG_BUILD}/product/vulkan_wsi/tools/wsi_layer/CMakeLists.txt +if [ "${DEVICE}" = "RK3588" ]; then + #BSP name?, probably can be removed when moving to mainline + HEAP_NAME=cma +else + HEAP_NAME=linux,cma +fi -if [ "${VULKAN_SUPPORT}" = "yes" ] -then - PKG_DEPENDS_TARGET+=" vulkan-loader vulkan-headers" +if [ "${ARCH}" = "aarch64" ]; then + INCLUDE_ARCH=arm64 +else + INCLUDE_ARCH=${ARCH} fi PKG_CMAKE_OPTS_TARGET+=" -DVULKAN_CXX_INCLUDE=${SYSROOT_PREFIX}/usr \ -DBUILD_WSI_HEADLESS=0 \ -DBUILD_WSI_WAYLAND=1 \ - -DSELECT_EXTERNAL_ALLOCATOR=ion - -DKERNEL_DIR=$(get_build_dir linux)" + -DSELECT_EXTERNAL_ALLOCATOR=dma_buf_heaps \ + -DWSIALLOC_MEMORY_HEAP_NAME=${HEAP_NAME} \ + -DKERNEL_HEADER_DIR=$(get_build_dir linux)/arch/${INCLUDE_ARCH}/include" } makeinstall_target() { diff --git a/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch b/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch new file mode 100644 index 0000000000..1e5637ba22 --- /dev/null +++ b/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch @@ -0,0 +1,102 @@ +From 797ef4d2ba9bd592868da2d23f9fc05c0ec235a8 Mon Sep 17 00:00:00 2001 +From: Ivan Podogov +Date: Mon, 11 Nov 2024 09:44:12 +0000 +Subject: [PATCH] Fall back to implicit sync if necessary + +--- + wsi/wayland/surface.cpp | 23 ++++++++++------------- + wsi/wayland/swapchain.cpp | 29 +++++++++++++++++++---------- + 2 files changed, 29 insertions(+), 23 deletions(-) + +diff --git a/wsi/wayland/surface.cpp b/wsi/wayland/surface.cpp +index 61ed4b5..0a686e7 100644 +--- a/wsi/wayland/surface.cpp ++++ b/wsi/wayland/surface.cpp +@@ -229,27 +229,24 @@ bool surface::init() + return false; + } + +- if (explicit_sync_interface.get() == nullptr) +- { +- WSI_LOG_ERROR("Failed to obtain zwp_linux_explicit_synchronization_v1 interface."); +- return false; +- } +- + if (presentation_time_interface.get() == nullptr) + { + WSI_LOG_ERROR("Failed to obtain wp_presentation interface."); + return false; + } + +- auto surface_sync_obj = +- zwp_linux_explicit_synchronization_v1_get_synchronization(explicit_sync_interface.get(), wayland_surface); +- if (surface_sync_obj == nullptr) ++ if (explicit_sync_interface.get() != nullptr) + { +- WSI_LOG_ERROR("Failed to retrieve surface synchronization interface"); +- return false; +- } ++ auto surface_sync_obj = ++ zwp_linux_explicit_synchronization_v1_get_synchronization(explicit_sync_interface.get(), wayland_surface); ++ if (surface_sync_obj == nullptr) ++ { ++ WSI_LOG_ERROR("Failed to retrieve surface synchronization interface"); ++ return false; ++ } + +- surface_sync_interface.reset(surface_sync_obj); ++ surface_sync_interface.reset(surface_sync_obj); ++ } + + VkResult vk_res = get_supported_formats_and_modifiers(wayland_display, surface_queue.get(), dmabuf_interface.get(), + supported_formats); +diff --git a/wsi/wayland/swapchain.cpp b/wsi/wayland/swapchain.cpp +index b83ace2..c5ac247 100644 +--- a/wsi/wayland/swapchain.cpp ++++ b/wsi/wayland/swapchain.cpp +@@ -496,16 +496,19 @@ void swapchain::present_image(const pending_present_request &pending_present) + + wl_surface_attach(m_surface, image_data->buffer, 0, 0); + +- auto present_sync_fd = image_data->present_fence.export_sync_fd(); +- if (!present_sync_fd.has_value()) ++ if (m_wsi_surface->get_surface_sync_interface() != nullptr) + { +- WSI_LOG_ERROR("Failed to export present fence."); +- set_error_state(VK_ERROR_SURFACE_LOST_KHR); +- } +- else if (present_sync_fd->is_valid()) +- { +- zwp_linux_surface_synchronization_v1_set_acquire_fence(m_wsi_surface->get_surface_sync_interface(), +- present_sync_fd->get()); ++ auto present_sync_fd = image_data->present_fence.export_sync_fd(); ++ if (!present_sync_fd.has_value()) ++ { ++ WSI_LOG_ERROR("Failed to export present fence."); ++ set_error_state(VK_ERROR_SURFACE_LOST_KHR); ++ } ++ else if (present_sync_fd->is_valid()) ++ { ++ zwp_linux_surface_synchronization_v1_set_acquire_fence(m_wsi_surface->get_surface_sync_interface(), ++ present_sync_fd->get()); ++ } + } + + /* TODO: work out damage */ +@@ -623,8 +626,14 @@ VkResult swapchain::image_set_present_payload(swapchain_image &image, VkQueue qu + return image_data->present_fence.set_payload(queue, semaphores, submission_pnext); + } + +-VkResult swapchain::image_wait_present(swapchain_image &, uint64_t) ++VkResult swapchain::image_wait_present(swapchain_image &image, uint64_t timeout) + { ++ if (m_wsi_surface->get_surface_sync_interface() == nullptr) ++ { ++ auto data = reinterpret_cast(image.data); ++ return data->present_fence.wait_payload(timeout); ++ } ++ + /* With explicit sync in use there is no need to wait for the present sync before submiting the image to the + * compositor. */ + return VK_SUCCESS; + diff --git a/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch.disabled b/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch.disabled deleted file mode 100644 index 21e0617624..0000000000 --- a/packages/graphics/vulkan/vulkan-wsi-layer/patches/sync.patch.disabled +++ /dev/null @@ -1,151 +0,0 @@ -diff --git a/wsi/swapchain_base.cpp b/wsi/swapchain_base.cpp -index af87d9f..0f2872b 100644 ---- a/wsi/swapchain_base.cpp -+++ b/wsi/swapchain_base.cpp -@@ -102,8 +102,9 @@ void swapchain_base::page_flip_thread() - image_index = *pending_index; - } - -- /* We may need to wait for the payload of the present sync of the oldest pending image to be finished. */ -- while ((vk_res = image_wait_present(sc_images[image_index], timeout)) == VK_TIMEOUT) -+ /* We wait for the fence of the oldest pending image to be signalled. */ -+ while ((vk_res = m_device_data.disp.WaitForFences(m_device, 1, -+ &sc_images[image_index].present_fence, VK_TRUE, timeout)) == VK_TIMEOUT) - { - WSI_LOG_WARNING("Timeout waiting for image's present fences, retrying.."); - } -@@ -690,14 +691,33 @@ VkResult swapchain_base::queue_present(VkQueue queue, const VkPresentInfoKHR *pr - TRY_LOG_CALL(image_wait_present(m_swapchain_images[image_index], WAIT_PRESENT_TIMEOUT)); - } - -- queue_submit_semaphores semaphores = { -- wait_semaphores, -- sem_count, -- (presentation_parameters.present_fence != VK_NULL_HANDLE) ? &m_swapchain_images[image_index].present_fence_wait : -- nullptr, -- (presentation_parameters.present_fence != VK_NULL_HANDLE) ? 1u : 0, -- }; -- TRY_LOG_CALL(image_set_present_payload(m_swapchain_images[image_index], queue, semaphores)); -+ /* When the semaphore that comes in is signalled, we know that all work is done. So, we do not -+ * want to block any future Vulkan queue work on it. So, we pass in BOTTOM_OF_PIPE bit as the -+ * wait flag. -+ */ -+ VkPipelineStageFlags pipeline_stage_flags = VK_PIPELINE_STAGE_BOTTOM_OF_PIPE_BIT; -+ -+ VkSubmitInfo submit_info = { VK_STRUCTURE_TYPE_SUBMIT_INFO, -+ NULL, -+ sem_count, -+ wait_semaphores, -+ &pipeline_stage_flags, -+ 0, -+ NULL, -+ 0, -+ NULL }; -+ -+ assert(m_swapchain_images[image_index].status == swapchain_image::ACQUIRED); -+ auto result = m_device_data.disp.ResetFences(m_device, -+ (presentation_parameters.present_fence != VK_NULL_HANDLE) ? 1u : 0, -+ (presentation_parameters.present_fence != VK_NULL_HANDLE) ? -+ &m_swapchain_images[image_index].present_fence : nullptr); -+ if (result != VK_SUCCESS) -+ { -+ return result; -+ } -+ -+ result = m_device_data.disp.QueueSubmit(queue, 1, &submit_info, m_swapchain_images[image_index].present_fence); - - if (presentation_parameters.present_fence != VK_NULL_HANDLE) - { -diff --git a/wsi/swapchain_base.hpp b/wsi/swapchain_base.hpp -index ec56053..394d2ff 100644 ---- a/wsi/swapchain_base.hpp -+++ b/wsi/swapchain_base.hpp -@@ -66,6 +66,7 @@ struct swapchain_image - - VkImage image{ VK_NULL_HANDLE }; - status status{ swapchain_image::INVALID }; -+ VkFence present_fence{VK_NULL_HANDLE}; - VkSemaphore present_semaphore{ VK_NULL_HANDLE }; - VkSemaphore present_fence_wait{ VK_NULL_HANDLE }; - }; -diff --git a/wsi/wayland/surface.cpp b/wsi/wayland/surface.cpp -index 923b67e..106a2dd 100644 ---- a/wsi/wayland/surface.cpp -+++ b/wsi/wayland/surface.cpp -@@ -216,22 +216,6 @@ bool surface::init() - return false; - } - -- if (explicit_sync_interface.get() == nullptr) -- { -- WSI_LOG_ERROR("Failed to obtain zwp_linux_explicit_synchronization_v1 interface."); -- return false; -- } -- -- auto surface_sync_obj = -- zwp_linux_explicit_synchronization_v1_get_synchronization(explicit_sync_interface.get(), wayland_surface); -- if (surface_sync_obj == nullptr) -- { -- WSI_LOG_ERROR("Failed to retrieve surface synchronization interface"); -- return false; -- } -- -- surface_sync_interface.reset(surface_sync_obj); -- - VkResult vk_res = get_supported_formats_and_modifiers(wayland_display, surface_queue.get(), dmabuf_interface.get(), - supported_formats); - if (vk_res != VK_SUCCESS) -diff --git a/wsi/wayland/swapchain.cpp b/wsi/wayland/swapchain.cpp -index e044f11..e43e6fe 100644 ---- a/wsi/wayland/swapchain.cpp -+++ b/wsi/wayland/swapchain.cpp -@@ -402,12 +402,13 @@ VkResult swapchain::allocate_and_bind_swapchain_image(VkImageCreateInfo image_cr - "Failed to import memory and bind swapchain image"); - - /* Initialize presentation fence. */ -- auto present_fence = sync_fd_fence_sync::create(m_device_data); -- if (!present_fence.has_value()) -+ VkFenceCreateInfo fenceInfo = { VK_STRUCTURE_TYPE_FENCE_CREATE_INFO, nullptr, 0 }; -+ auto result = m_device_data.disp.CreateFence(m_device, &fenceInfo, get_allocation_callbacks(), &image.present_fence); -+ if (result != VK_SUCCESS) - { -- return VK_ERROR_OUT_OF_HOST_MEMORY; -+ destroy_image(image); -+ return result; - } -- image_data->present_fence = std::move(present_fence.value()); - - return VK_SUCCESS; - } -@@ -477,18 +478,6 @@ void swapchain::present_image(uint32_t pendingIndex) - - wl_surface_attach(m_surface, image_data->buffer, 0, 0); - -- auto present_sync_fd = image_data->present_fence.export_sync_fd(); -- if (!present_sync_fd.has_value()) -- { -- WSI_LOG_ERROR("Failed to export present fence."); -- set_error_state(VK_ERROR_SURFACE_LOST_KHR); -- } -- else if (present_sync_fd->is_valid()) -- { -- zwp_linux_surface_synchronization_v1_set_acquire_fence(m_wsi_surface->get_surface_sync_interface(), -- present_sync_fd->get()); -- } -- - /* TODO: work out damage */ - wl_surface_damage(m_surface, 0, 0, INT32_MAX, INT32_MAX); - -@@ -516,6 +505,12 @@ void swapchain::destroy_image(swapchain_image &image) - - if (image.status != swapchain_image::INVALID) - { -+ if (image.present_fence != VK_NULL_HANDLE) -+ { -+ m_device_data.disp.DestroyFence(m_device, image.present_fence, get_allocation_callbacks()); -+ image.present_fence = VK_NULL_HANDLE; -+ } -+ - if (image.image != VK_NULL_HANDLE) - { - m_device_data.disp.DestroyImage(m_device, image.image, get_allocation_callbacks()); diff --git a/packages/hardware/quirks/platforms/RK3588/090-ui_service b/packages/hardware/quirks/platforms/RK3588/090-ui_service index ca14b6a938..5da8b376c7 100755 --- a/packages/hardware/quirks/platforms/RK3588/090-ui_service +++ b/packages/hardware/quirks/platforms/RK3588/090-ui_service @@ -4,14 +4,5 @@ ### Set the default device configuration cat </storage/.config/profile.d/090-ui_service -GPUDRIVER=$(/usr/bin/gpudriver) - -case \${GPUDRIVER} in - "libmali") - UI_SERVICE="weston.service" - ;; - "panfrost") - UI_SERVICE="sway.service essway.service" - ;; -esac +UI_SERVICE="sway.service essway.service" EOF diff --git a/packages/hardware/quirks/platforms/S922X/090-ui_service b/packages/hardware/quirks/platforms/S922X/090-ui_service index bc7013fc95..5da8b376c7 100755 --- a/packages/hardware/quirks/platforms/S922X/090-ui_service +++ b/packages/hardware/quirks/platforms/S922X/090-ui_service @@ -4,5 +4,5 @@ ### Set the default device configuration cat </storage/.config/profile.d/090-ui_service -UI_SERVICE="weston.service" +UI_SERVICE="sway.service essway.service" EOF diff --git a/packages/rocknix/sources/post-update b/packages/rocknix/sources/post-update index 9101a48e5f..2b054c820c 100644 --- a/packages/rocknix/sources/post-update +++ b/packages/rocknix/sources/post-update @@ -127,3 +127,10 @@ fi # Rename network.enabled to wifi.enabled sed -i 's/network.enabled/wifi.enabled/g' /storage/.config/system/configs/system.cfg + +# Add skip IPL/bios option tol dolphin config +DINI=/storage/.config/dolphin-emu/Dolphin.ini +grep -q "SkipIPL" "$DINI" +if [ $? -ne 0 ]; then + sed -i "/\[Core\]/a SkipIPL = True" $DINI +fi diff --git a/packages/ui/emulationstation/config/common/es_features.cfg b/packages/ui/emulationstation/config/common/es_features.cfg index 48f334cfda..9dd3c8b94b 100644 --- a/packages/ui/emulationstation/config/common/es_features.cfg +++ b/packages/ui/emulationstation/config/common/es_features.cfg @@ -475,9 +475,10 @@ - - - + + + + @@ -497,6 +498,10 @@ + + + + @@ -567,6 +572,10 @@ + + + + diff --git a/packages/virtual/emulators/package.mk b/packages/virtual/emulators/package.mk index b70bd6e00a..1d2456f73e 100644 --- a/packages/virtual/emulators/package.mk +++ b/packages/virtual/emulators/package.mk @@ -502,14 +502,14 @@ makeinstall_target() { ### Nintendo GameCube case ${DEVICE} in - AMD64|SD865|RK3399) - add_emu_core gamecube dolphin dolphin-sa-gc true - add_emu_core gamecube dolphin dolphin-qt-gc false + AMD64|SD865|RK3399|S922X|RK3588) + add_emu_core gamecube dolphin dolphin-sa-gc false + add_emu_core gamecube dolphin dolphin-qt-gc true add_emu_core gamecube retroarch dolphin false install_script "Start Dolphin.sh" add_es_system gamecube ;; - S922X|RK35*) + RK3566) add_emu_core gamecube dolphin dolphin-sa-gc true add_emu_core gamecube retroarch dolphin false add_es_system gamecube @@ -518,13 +518,13 @@ makeinstall_target() { ### Nintendo Wii case ${DEVICE} in - AMD64|SD865|RK3399) - add_emu_core wii dolphin dolphin-sa-wii true - add_emu_core wii dolphin dolphin-qt-gc false + AMD64|SD865|RK3399|S922X|RK3588) + add_emu_core wii dolphin dolphin-sa-wii false + add_emu_core wii dolphin dolphin-qt-wii true add_emu_core wii retroarch dolphin false add_es_system wii ;; - S922X|RK35*) + RK3566) add_emu_core wii dolphin dolphin-sa-wii true add_emu_core wii retroarch dolphin false add_es_system wii diff --git a/packages/wayland/lib/wlroots/package.mk b/packages/wayland/lib/wlroots/package.mk index 676ebfc34a..a1d226e466 100644 --- a/packages/wayland/lib/wlroots/package.mk +++ b/packages/wayland/lib/wlroots/package.mk @@ -7,6 +7,7 @@ PKG_SITE="https://gitlab.freedesktop.org/wlroots/wlroots/" PKG_DEPENDS_TARGET="toolchain libinput libxkbcommon pixman libdrm wayland wayland-protocols seatd xwayland hwdata libxcb xcb-util-wm" PKG_LONGDESC="A modular Wayland compositor library" PKG_TOOLCHAIN="meson" +PKG_PATCH_DIRS+="${DEVICE}" case ${DEVICE} in SD865|AMD64|RK3399|H700) diff --git a/packages/wayland/lib/wlroots/patches/S922X/001-libmali-workaround-allow-zero-stride.patch b/packages/wayland/lib/wlroots/patches/S922X/001-libmali-workaround-allow-zero-stride.patch new file mode 100644 index 0000000000..fa9502c227 --- /dev/null +++ b/packages/wayland/lib/wlroots/patches/S922X/001-libmali-workaround-allow-zero-stride.patch @@ -0,0 +1,12 @@ +--- wlroots-0.18.0-rk/types/wlr_linux_dmabuf_v1.c.orig 2024-07-20 23:02:01.157348294 +0000 ++++ wlroots-0.18.0-rk/types/wlr_linux_dmabuf_v1.c 2024-07-20 23:03:40.695105841 +0000 +@@ -324,8 +324,7 @@ + goto err_out; + } + +- if (attribs.offset[i] + attribs.stride[i] > size || +- attribs.stride[i] == 0) { ++ if (attribs.offset[i] + attribs.stride[i] > size) { + wl_resource_post_error(params_resource, + ZWP_LINUX_BUFFER_PARAMS_V1_ERROR_OUT_OF_BOUNDS, + "invalid stride %" PRIu32 " for plane %d", diff --git a/projects/Amlogic/devices/S922X/options b/projects/Amlogic/devices/S922X/options index 78e1f28530..f26863448f 100644 --- a/projects/Amlogic/devices/S922X/options +++ b/projects/Amlogic/devices/S922X/options @@ -57,7 +57,7 @@ DISPLAYSERVER="wl" # Windowmanager to use (weston / swaywm-env / no) - WINDOWMANAGER="weston11" + WINDOWMANAGER="swaywm-env" # build and install rocknix joypad driver (yes / no) ROCKNIX_JOYPAD="yes" diff --git a/projects/Amlogic/packages/libmali/package.mk b/projects/Amlogic/packages/libmali/package.mk index 3aa371bc99..829017c4f6 100644 --- a/projects/Amlogic/packages/libmali/package.mk +++ b/projects/Amlogic/packages/libmali/package.mk @@ -7,7 +7,7 @@ PKG_LICENSE="mali_driver" PKG_ARCH="aarch64" PKG_SITE="https://developer.arm.com/downloads/-/mali-drivers/user-space" PKG_URL="https://developer.arm.com/-/media/Files/downloads/mali-drivers/user-space/odroid-n2plus/BXODROIDN2PL-${PKG_VERSION}.tar" -PKG_DEPENDS_TARGET="toolchain mesa vulkan-tools gpudriver" +PKG_DEPENDS_TARGET="toolchain mesa vulkan-tools gpudriver vulkan-wsi-layer" PKG_TOOLCHAIN="manual" PKG_LONGDESC="OpenGL ES and Vulkan Mali drivers for s922x soc" @@ -26,4 +26,6 @@ makeinstall_target() { tar -xvJf ${PKG_BUILD}/rootfs_additions.tar.xz -C ${INSTALL}/usr/share mv ${INSTALL}/usr/share/etc/vulkan/* ${INSTALL}/usr/share/vulkan/ rm -r ${INSTALL}/usr/share/etc + # Remove packages WSI layer, we build our own + rm -r ${INSTALL}/usr/share/vulkan/implicit_layer.d } diff --git a/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf b/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf index 7aaf0bb517..8bf54457d2 100644 --- a/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf +++ b/projects/Rockchip/devices/RK3588/linux/linux.aarch64.conf @@ -6728,17 +6728,6 @@ CONFIG_STAGING=y # CONFIG_FB_SM750 is not set # CONFIG_STAGING_MEDIA is not set - -# -# Android -# -CONFIG_ANDROID=y -# CONFIG_ASHMEM is not set -CONFIG_ION=y -# CONFIG_ION_SYSTEM_HEAP is not set -CONFIG_ION_CMA_HEAP=y -# end of Android - # CONFIG_STAGING_BOARD is not set # CONFIG_LTE_GDM724X is not set CONFIG_FB_TFT=y @@ -7687,9 +7676,7 @@ CONFIG_ARM_PMU=y # # Android # -CONFIG_ANDROID_BINDER_IPC=y -CONFIG_ANDROID_BINDERFS=y -CONFIG_ANDROID_BINDER_DEVICES="binder,hwbinder,vndbinder,anbox-binder,anbox-hwbinder,anbox-vndbinder" +# CONFIG_ANDROID_BINDER_IPC is not set # CONFIG_ANDROID_BINDER_IPC_SELFTEST is not set # end of Android diff --git a/projects/Rockchip/devices/RK3588/options b/projects/Rockchip/devices/RK3588/options index f154c0bed9..b0cbb0e655 100644 --- a/projects/Rockchip/devices/RK3588/options +++ b/projects/Rockchip/devices/RK3588/options @@ -57,7 +57,7 @@ DISPLAYSERVER="wl" # Windowmanager to use (weston / swaywm-env / no) - WINDOWMANAGER="weston swaywm-env" + WINDOWMANAGER="swaywm-env" # kernel serial console EXTRA_CMDLINE="quiet console=ttyFIQ0 console=tty0 systemd.debug_shell=ttyFIQ0 coherent_pool=2M fbcon=rotate:1" @@ -69,7 +69,7 @@ ROCKNIX_DEVICE_TREE_OVERLAYS="yes" # additional packages to install - ADDITIONAL_PACKAGES="libmali weston-kiosk-shell-dpms libmali-vulkan" + ADDITIONAL_PACKAGES="libmali libmali-vulkan" # additional Firmware to use ( ) # Space separated list is supported,