mirror of
https://git.eden-emu.dev/eden-emu/eden.git
synced 2026-10-11 07:03:21 +00:00
Compare commits
15 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 17c3fb88f4 | |||
| 18de787ba1 | |||
| c746982201 | |||
| 67bada77f8 | |||
| 3cdd2ce141 | |||
| 10bcd2d849 | |||
| 48aeedd3b3 | |||
| d16735f5b6 | |||
| d3550c4571 | |||
| 963119e7cc | |||
| 2a7e9b53b1 | |||
| 8e2d26c272 | |||
| f8b7651104 | |||
| 3f78512c83 | |||
| a82f31a310 |
+1
-1
@@ -79,7 +79,7 @@
|
|||||||
"name": "ffmpeg",
|
"name": "ffmpeg",
|
||||||
"package": "FFmpeg",
|
"package": "FFmpeg",
|
||||||
"repo": "crueter-ci/FFmpeg",
|
"repo": "crueter-ci/FFmpeg",
|
||||||
"version": "9.0.1-1788120736-bf1b838f2a"
|
"version": "9.0.2-1790726865-946fcce07b"
|
||||||
},
|
},
|
||||||
"fmt": {
|
"fmt": {
|
||||||
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
"hash": "f0da82c545b01692e9fd30fdfb613dbb8dd9716983dcd0ff19ac2a8d36f74beb5540ef38072fdecc1e34191b3682a8542ecbf3a61ef287dbba0a2679d4e023f2",
|
||||||
|
|||||||
Vendored
+547
-576
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+443
-477
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-470
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-470
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-470
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+443
-477
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-470
File diff suppressed because it is too large
Load Diff
Vendored
+442
-470
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+443
-477
File diff suppressed because it is too large
Load Diff
Vendored
+444
-474
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+447
-474
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+443
-477
File diff suppressed because it is too large
Load Diff
Vendored
+442
-469
File diff suppressed because it is too large
Load Diff
Vendored
+125
-166
@@ -11,11 +11,9 @@ set(FFmpeg_HWACCEL_LDFLAGS)
|
|||||||
|
|
||||||
if (NOT YUZU_USE_BUNDLED_FFMPEG)
|
if (NOT YUZU_USE_BUNDLED_FFMPEG)
|
||||||
set(FFmpeg_CROSS_COMPILE_FLAGS "")
|
set(FFmpeg_CROSS_COMPILE_FLAGS "")
|
||||||
if (CMAKE_CROSSCOMPILING)
|
if (ANDROID)
|
||||||
message(STATUS "ffmpeg: Enabling cross compilation ${CMAKE_SYSTEM_NAME}-${CMAKE_SYSTEM_PROCESSOR}")
|
|
||||||
# TODO: Maybe use CMAKE_SYSROOT? and probably provide a toolchain file for android
|
# TODO: Maybe use CMAKE_SYSROOT? and probably provide a toolchain file for android
|
||||||
# I mean isn't that the "proper" way anyways?
|
# I mean isn't that the "proper" way anyways?
|
||||||
if (ANDROID)
|
|
||||||
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME)
|
string(TOLOWER "${CMAKE_HOST_SYSTEM_NAME}" FFmpeg_HOST_SYSTEM_NAME)
|
||||||
set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}")
|
set(TOOLCHAIN "${ANDROID_NDK}/toolchains/llvm/prebuilt/${FFmpeg_HOST_SYSTEM_NAME}-${CMAKE_HOST_SYSTEM_PROCESSOR}")
|
||||||
set(SYSROOT "${TOOLCHAIN}/sysroot")
|
set(SYSROOT "${TOOLCHAIN}/sysroot")
|
||||||
@@ -28,14 +26,16 @@ if (NOT YUZU_USE_BUNDLED_FFMPEG)
|
|||||||
--sysroot="${SYSROOT}"
|
--sysroot="${SYSROOT}"
|
||||||
--target-os=android
|
--target-os=android
|
||||||
--extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld"
|
--extra-ldflags="--ld-path=${TOOLCHAIN}/bin/ld.lld"
|
||||||
--extra-ldflags="-nostdlib")
|
--extra-ldflags="-nostdlib"
|
||||||
|
)
|
||||||
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
||||||
else()
|
# User attempts to do a FFmpeg cross compilation because...
|
||||||
|
# Here we just quickly test against host/system processors not matching
|
||||||
|
# TODO: Test for versions not matching as well?
|
||||||
|
elseif (NOT (CMAKE_HOST_SYSTEM_PROCESSOR MATCHES CMAKE_SYSTEM_PROCESSOR
|
||||||
|
AND CMAKE_HOST_SYSTEM_NAME MATCHES CMAKE_SYSTEM_NAME))
|
||||||
string(TOLOWER "${CMAKE_SYSTEM_NAME}" FFmpeg_SYSTEM_NAME)
|
string(TOLOWER "${CMAKE_SYSTEM_NAME}" FFmpeg_SYSTEM_NAME)
|
||||||
# systems FFmpeg natively supports
|
if (FFmpeg_SYSTEM_NAME STREQUAL "openorbis" OR FFmpeg_SYSTEM_NAME STREQUAL "managarm")
|
||||||
if (NOT (NETBSD OR SOLARIS OR FREEBSD
|
|
||||||
OR OPENBSD OR DRAGONFLYBSD OR HAIKU
|
|
||||||
OR LINUX OR MSYS OR WIN32 OR ANDROID OR APPLE))
|
|
||||||
set(FFmpeg_SYSTEM_NAME "none")
|
set(FFmpeg_SYSTEM_NAME "none")
|
||||||
endif()
|
endif()
|
||||||
# TODO: Can we really do better? Auto-detection? Something clever?
|
# TODO: Can we really do better? Auto-detection? Something clever?
|
||||||
@@ -43,117 +43,78 @@ if (NOT YUZU_USE_BUNDLED_FFMPEG)
|
|||||||
--enable-cross-compile
|
--enable-cross-compile
|
||||||
--arch="${CMAKE_SYSTEM_PROCESSOR}"
|
--arch="${CMAKE_SYSTEM_PROCESSOR}"
|
||||||
--target-os="${FFmpeg_SYSTEM_NAME}"
|
--target-os="${FFmpeg_SYSTEM_NAME}"
|
||||||
--sysroot="${CMAKE_SYSROOT}")
|
--sysroot="${CMAKE_SYSROOT}"
|
||||||
|
)
|
||||||
if (DEFINED FFmpeg_CROSS_PREFIX)
|
if (DEFINED FFmpeg_CROSS_PREFIX)
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --cross-prefix="${FFmpeg_CROSS_PREFIX}")
|
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --cross-prefix="${FFmpeg_CROSS_PREFIX}")
|
||||||
else()
|
else()
|
||||||
message(FATAL_ERROR "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-")
|
message(WARNING "Please set FFmpeg_CROSS_PREFIX to your cross toolchain prefix, for example: \${CMAKE_STAGING_PREFIX}/bin/${CMAKE_SYSTEM_PROCESSOR}-${CMAKE_SYSTEM_NAME}-")
|
||||||
endif()
|
endif()
|
||||||
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
set(FFmpeg_IS_CROSS_COMPILING TRUE)
|
||||||
endif()
|
endif()
|
||||||
endif()
|
endif()
|
||||||
endif()
|
|
||||||
|
|
||||||
if (WIN32)
|
if (OPENORBIS OR MANAGARM)
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
# Doesn't support VA-API, don't go thru the embarrassment of trying to enable it
|
||||||
--enable-d3d11va
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
||||||
--enable-d3d12va
|
|
||||||
--enable-dxva2
|
|
||||||
--enable-hwaccel=d3d11va_h264
|
|
||||||
--enable-hwaccel=d3d11va2_h264
|
|
||||||
--enable-hwaccel=d3d12va_h264
|
|
||||||
--enable-hwaccel=dxva2_h264
|
|
||||||
--enable-hwaccel=d3d11va_vp9
|
|
||||||
--enable-hwaccel=d3d11va2_vp9
|
|
||||||
--enable-hwaccel=d3d12va_vp9
|
|
||||||
--enable-hwaccel=dxva2_vp9)
|
|
||||||
elseif (ANDROID)
|
elseif (ANDROID)
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-mediacodec
|
--enable-mediacodec
|
||||||
--enable-jni
|
--enable-jni
|
||||||
--enable-decoder=h264_mediacodec
|
)
|
||||||
--enable-decoder=vp8_mediacodec
|
elseif (UNIX AND NOT DEFINED FFmpeg_IS_CROSS_COMPILING AND NOT ANDROID)
|
||||||
--enable-decoder=vp9_mediacodec)
|
find_package(PkgConfig REQUIRED)
|
||||||
elseif (APPLE)
|
pkg_check_modules(LIBVA libva)
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
pkg_check_modules(CUDA cuda)
|
||||||
--enable-videotoolbox
|
pkg_check_modules(FFNVCODEC ffnvcodec)
|
||||||
--enable-hwaccel=videotoolbox_h264
|
pkg_check_modules(VDPAU vdpau)
|
||||||
--enable-hwaccel=videotoolbox_vp9)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
find_package(X11)
|
find_package(X11)
|
||||||
if(X11_FOUND)
|
if(X11_FOUND)
|
||||||
# Include X11 if possible, VDPAU lists it as complementary
|
if (NOT APPLE)
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${X11_LIBRARIES})
|
# In Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${X11_INCLUDE_DIRS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${X11_LDFLAGS})
|
|
||||||
else()
|
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
|
||||||
endif()
|
|
||||||
message(STATUS "ffmpeg: X11 ${X11_FOUND} ${X11_VERSION}")
|
|
||||||
|
|
||||||
find_package(PkgConfig)
|
|
||||||
if (PkgConfig_FOUND)
|
|
||||||
pkg_check_modules(LIBDRM libdrm)
|
|
||||||
if (LIBDRM_FOUND)
|
|
||||||
# Solaris needs explicit linking for ffmpeg which links to /lib/amd64/libX11.so
|
|
||||||
if(SOLARIS)
|
if(SOLARIS)
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
X11
|
X11
|
||||||
"${CMAKE_SYSROOT}/usr/lib/xorg/amd64/libdrm.so")
|
"${CMAKE_SYSROOT}/usr/lib/xorg/amd64/libdrm.so")
|
||||||
else()
|
else()
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${LIBDRM_LIBRARIES})
|
pkg_check_modules(LIBDRM libdrm REQUIRED)
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${LIBDRM_INCLUDE_DIRS})
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${LIBDRM_LDFLAGS})
|
${LIBDRM_LIBRARIES})
|
||||||
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
||||||
|
${LIBDRM_INCLUDE_DIRS})
|
||||||
endif()
|
endif()
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS --enable-libdrm)
|
|
||||||
endif()
|
|
||||||
|
|
||||||
pkg_check_modules(LIBVA libva)
|
|
||||||
if(LIBVA_FOUND)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${LIBVA_LIBRARIES})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${LIBVA_INCLUDE_DIRS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${LIBVA_LDFLAGS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-vaapi
|
--enable-libdrm)
|
||||||
|
endif()
|
||||||
|
if(LIBVA_FOUND)
|
||||||
|
pkg_check_modules(LIBVA-DRM libva-drm REQUIRED)
|
||||||
|
pkg_check_modules(LIBVA-X11 libva-x11 REQUIRED)
|
||||||
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES
|
||||||
|
${X11_LIBRARIES}
|
||||||
|
${LIBVA-DRM_LIBRARIES}
|
||||||
|
${LIBVA-X11_LIBRARIES}
|
||||||
|
${LIBVA_LIBRARIES})
|
||||||
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-hwaccel=h264_vaapi
|
--enable-hwaccel=h264_vaapi
|
||||||
--enable-hwaccel=vp8_vaapi
|
--enable-hwaccel=vp8_vaapi
|
||||||
--enable-hwaccel=vp9_vaapi)
|
--enable-hwaccel=vp9_vaapi)
|
||||||
# Logically, they can only exist if libva itself exists
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS
|
||||||
pkg_check_modules(LIBVA-DRM libva-drm)
|
${X11_INCLUDE_DIRS}
|
||||||
if (LIBVA-DRM_FOUND)
|
${LIBVA-DRM_INCLUDE_DIRS}
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${LIBVA-DRM_LIBRARIES})
|
${LIBVA-X11_INCLUDE_DIRS}
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${LIBVA-DRM_INCLUDE_DIRS})
|
${LIBVA_INCLUDE_DIRS}
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${LIBVA-DRM_LDFLAGS})
|
)
|
||||||
endif()
|
message(STATUS "ffmpeg: va-api libraries version ${LIBVA_VERSION} found")
|
||||||
message(STATUS "ffmpeg: LIBVA-DRM ${LIBVA-DRM_FOUND} ${LIBVA-DRM_VERSION}")
|
|
||||||
pkg_check_modules(LIBVA-X11 libva-x11)
|
|
||||||
if (LIBVA-X11_FOUND)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${LIBVA-X11_LIBRARIES})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${LIBVA-X11_INCLUDE_DIRS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${LIBVA-X11_LDFLAGS})
|
|
||||||
endif()
|
|
||||||
message(STATUS "ffmpeg: LIBVA-X11 ${LIBVA-X11_FOUND} ${LIBVA-X11_VERSION}")
|
|
||||||
else()
|
else()
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
||||||
|
message(WARNING "ffmpeg: libva-dev not found, disabling Video Acceleration API (VA-API)...")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "ffmpeg: LIBVA ${LIBVA_FOUND} ${LIBVA_VERSION}")
|
|
||||||
|
|
||||||
pkg_check_modules(VDPAU vdpau)
|
|
||||||
if (VDPAU_FOUND)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
|
||||||
--enable-vdpau
|
|
||||||
--enable-hwaccel=h264_vdpau
|
|
||||||
--enable-hwaccel=vp9_vdpau)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS})
|
|
||||||
else()
|
else()
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau)
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vaapi)
|
||||||
|
message(WARNING "ffmpeg: X11 libraries not found, disabling VA-API...")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "ffmpeg: VDPAU ${VDPAU_FOUND} ${VDPAU_VERSION}")
|
|
||||||
|
|
||||||
pkg_check_modules(FFNVCODEC ffnvcodec)
|
|
||||||
if (FFNVCODEC_FOUND)
|
if (FFNVCODEC_FOUND)
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-cuvid
|
--enable-cuvid
|
||||||
@@ -161,42 +122,39 @@ if (PkgConfig_FOUND)
|
|||||||
--enable-nvdec
|
--enable-nvdec
|
||||||
--enable-hwaccel=h264_nvdec
|
--enable-hwaccel=h264_nvdec
|
||||||
--enable-hwaccel=vp8_nvdec
|
--enable-hwaccel=vp8_nvdec
|
||||||
--enable-hwaccel=vp9_nvdec)
|
--enable-hwaccel=vp9_nvdec
|
||||||
|
)
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${FFNVCODEC_LIBRARIES})
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${FFNVCODEC_LIBRARIES})
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${FFNVCODEC_INCLUDE_DIRS})
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${FFNVCODEC_INCLUDE_DIRS})
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${FFNVCODEC_LDFLAGS})
|
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${FFNVCODEC_LDFLAGS})
|
||||||
|
message(STATUS "ffmpeg: ffnvcodec libraries version ${FFNVCODEC_VERSION} found")
|
||||||
# ffnvenc could load CUDA libraries at the runtime using dlopen/dlsym or LoadLibrary/GetProcAddress
|
# ffnvenc could load CUDA libraries at the runtime using dlopen/dlsym or LoadLibrary/GetProcAddress
|
||||||
# here we handle the hard-linking scenario where CUDA is linked during compilation
|
# here we handle the hard-linking scenario where CUDA is linked during compilation
|
||||||
find_package(CUDAToolkit)
|
if (CUDA_FOUND)
|
||||||
if (CUDAToolkit_FOUND)
|
# This line causes build error if CUDA_INCLUDE_DIRS is anything but a single non-empty value
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${CUDAToolkit_LIBRARIES})
|
#list(APPEND FFmpeg_HWACCEL_FLAGS --extra-cflags=-I${CUDA_INCLUDE_DIRS})
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${CUDAToolkit_INCLUDE_DIRS})
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${CUDA_LIBRARIES})
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${CUDAToolkit_LDFLAGS})
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${CUDA_INCLUDE_DIRS})
|
||||||
|
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${CUDA_LDFLAGS})
|
||||||
|
message(STATUS "ffmpeg: CUDA libraries version ${CUDA_VERSION} found, hard-linking will be performed")
|
||||||
|
endif(CUDA_FOUND)
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "ffmpeg: CUDAToolkit ${CUDAToolkit_FOUND} ${CUDAToolkit_VERSION}")
|
|
||||||
endif()
|
|
||||||
message(STATUS "ffmpeg: FFNVCODEC ${FFNVCODEC_FOUND} ${FFNVCODEC_VERSION}")
|
|
||||||
endif()
|
|
||||||
message(STATUS "ffmpeg: PkgConfig ${PkgConfig_FOUND} ${PkgConfig_VERSION}")
|
|
||||||
|
|
||||||
find_package(Vulkan)
|
if (VDPAU_FOUND AND NOT APPLE)
|
||||||
if (Vulkan_FOUND)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_FLAGS
|
list(APPEND FFmpeg_HWACCEL_FLAGS
|
||||||
--enable-vulkan
|
--enable-vdpau
|
||||||
--enable-hwaccel=h264_vulkan
|
--enable-hwaccel=h264_vdpau
|
||||||
--enable-hwaccel=vp9_vulkan)
|
--enable-hwaccel=vp9_vdpau
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${Vulkan_LIBRARIES})
|
)
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${Vulkan_INCLUDE_DIRS})
|
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${VDPAU_LIBRARIES})
|
||||||
|
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${VDPAU_INCLUDE_DIRS})
|
||||||
|
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${VDPAU_LDFLAGS})
|
||||||
|
message(STATUS "ffmpeg: vdpau libraries version ${VDPAU_VERSION} found")
|
||||||
|
else()
|
||||||
|
list(APPEND FFmpeg_HWACCEL_FLAGS --disable-vdpau)
|
||||||
|
message(WARNING "ffmpeg: libvdpau-dev not found, disabling Video Decode and Presentation API for Unix (VDPAU)...")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "ffmpeg: Vulkan ${Vulkan_FOUND} ${Vulkan_VERSION}")
|
|
||||||
|
|
||||||
find_package(spirv-headers)
|
|
||||||
if (spirv-headers_FOUND)
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LIBRARIES ${spirv-headers_LIBRARIES})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_INCLUDE_DIRS ${spirv-headers_INCLUDE_DIRS})
|
|
||||||
list(APPEND FFmpeg_HWACCEL_LDFLAGS ${spirv-headers_LDFLAGS})
|
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "ffmpeg: spirv-headers ${spirv-headers_FOUND} ${spirv-headers_VERSION}")
|
|
||||||
|
|
||||||
if (OPENORBIS)
|
if (OPENORBIS)
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_LIBS
|
list(APPEND FFmpeg_CROSS_COMPILE_LIBS
|
||||||
@@ -204,28 +162,20 @@ if (OPENORBIS)
|
|||||||
-lSceUserService
|
-lSceUserService
|
||||||
-lSceSysmodule
|
-lSceSysmodule
|
||||||
-lSceNet
|
-lSceNet
|
||||||
-lSceLibcInternal)
|
-lSceLibcInternal
|
||||||
|
)
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
||||||
--disable-pthreads
|
--disable-pthreads
|
||||||
--extra-cflags=${CMAKE_SYSROOT}/usr/include
|
--extra-cflags=${CMAKE_SYSROOT}/usr/include
|
||||||
--extra-cxxflags=${CMAKE_SYSROOT}/usr/include
|
--extra-cxxflags=${CMAKE_SYSROOT}/usr/include
|
||||||
--extra-libs="${FFmpeg_CROSS_COMPILE_LIBS}")
|
--extra-libs="${FFmpeg_CROSS_COMPILE_LIBS}"
|
||||||
|
)
|
||||||
elseif (MANAGARM)
|
elseif (MANAGARM)
|
||||||
# Required for proper stuff
|
# Required for proper stuff
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS
|
||||||
--disable-pthreads
|
--disable-pthreads
|
||||||
--extra-libs="${FFmpeg_CROSS_COMPILE_LIBS}")
|
--extra-libs="${FFmpeg_CROSS_COMPILE_LIBS}"
|
||||||
endif()
|
)
|
||||||
|
|
||||||
# Usually used by Emscripten
|
|
||||||
if (DEFINED CMAKE_AR)
|
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --ar=${CMAKE_AR})
|
|
||||||
endif()
|
|
||||||
if (DEFINED CMAKE_NM)
|
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --nm=${CMAKE_NM})
|
|
||||||
endif()
|
|
||||||
if (DEFINED CMAKE_RANLIB)
|
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --ranlib=${CMAKE_RANLIB})
|
|
||||||
endif()
|
endif()
|
||||||
|
|
||||||
if (YUZU_USE_BUNDLED_FFMPEG)
|
if (YUZU_USE_BUNDLED_FFMPEG)
|
||||||
@@ -233,32 +183,43 @@ if (YUZU_USE_BUNDLED_FFMPEG)
|
|||||||
|
|
||||||
set(FFmpeg_INCLUDE_DIR
|
set(FFmpeg_INCLUDE_DIR
|
||||||
"${FFmpeg_SOURCE_DIR}/include;${FFmpeg_HWACCEL_INCLUDE_DIRS}"
|
"${FFmpeg_SOURCE_DIR}/include;${FFmpeg_HWACCEL_INCLUDE_DIRS}"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
|
||||||
set(FFmpeg_PATH
|
set(FFmpeg_PATH
|
||||||
"${FFmpeg_SOURCE_DIR}"
|
"${FFmpeg_SOURCE_DIR}"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
|
||||||
set(FFmpeg_LIBRARY_DIR
|
set(FFmpeg_LIBRARY_DIR
|
||||||
"${FFmpeg_SOURCE_DIR}/bin"
|
"${FFmpeg_SOURCE_DIR}/bin"
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
|
|
||||||
set(FFmpeg_LIBRARIES
|
set(FFmpeg_LIBRARIES
|
||||||
FFmpeg::FFmpeg
|
FFmpeg::FFmpeg
|
||||||
${FFmpeg_HWACCEL_LIBRARIES}
|
${FFmpeg_HWACCEL_LIBRARIES}
|
||||||
PARENT_SCOPE)
|
PARENT_SCOPE
|
||||||
|
)
|
||||||
set(FFmpeg_FOUND YES)
|
|
||||||
else()
|
else()
|
||||||
# Build FFmpeg from externals
|
# Build FFmpeg from externals
|
||||||
message(STATUS "Using FFmpeg from externals")
|
message(STATUS "Using FFmpeg from externals")
|
||||||
AddJsonPackage(ffmpeg)
|
|
||||||
|
|
||||||
# FFmpeg has source that requires one of nasm or yasm to assemble it.
|
|
||||||
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64|amd64)")
|
if (CMAKE_SYSTEM_PROCESSOR MATCHES "(x86_64|amd64)")
|
||||||
find_program(ASSEMBLER NAMES nasm yasm REQUIRED)
|
# FFmpeg has source that requires one of nasm or yasm to assemble it.
|
||||||
|
# REQUIRED throws an error if not found here during configuration rather than during compilation.
|
||||||
|
find_program(ASSEMBLER NAMES nasm yasm)
|
||||||
|
if ("${ASSEMBLER}" STREQUAL "ASSEMBLER-NOTFOUND")
|
||||||
|
message(FATAL_ERROR "One of either `nasm` or `yasm` not found but is required.")
|
||||||
endif()
|
endif()
|
||||||
find_program(AUTOCONF autoconf REQUIRED)
|
endif()
|
||||||
|
|
||||||
|
find_program(AUTOCONF autoconf)
|
||||||
|
if ("${AUTOCONF}" STREQUAL "AUTOCONF-NOTFOUND")
|
||||||
|
message(FATAL_ERROR "Required program `autoconf` not found.")
|
||||||
|
endif()
|
||||||
|
|
||||||
|
AddJsonPackage(ffmpeg)
|
||||||
|
|
||||||
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
|
set(FFmpeg_PREFIX ${ffmpeg_SOURCE_DIR})
|
||||||
set(FFmpeg_BUILD_DIR ${ffmpeg_BINARY_DIR})
|
set(FFmpeg_BUILD_DIR ${ffmpeg_BINARY_DIR})
|
||||||
@@ -291,13 +252,6 @@ else()
|
|||||||
# `--disable-vdpau` is needed to avoid linking issues
|
# `--disable-vdpau` is needed to avoid linking issues
|
||||||
set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER})
|
set(FFmpeg_CC ${CMAKE_C_COMPILER_LAUNCHER} ${CMAKE_C_COMPILER})
|
||||||
set(FFmpeg_CXX ${CMAKE_CXX_COMPILER_LAUNCHER} ${CMAKE_CXX_COMPILER})
|
set(FFmpeg_CXX ${CMAKE_CXX_COMPILER_LAUNCHER} ${CMAKE_CXX_COMPILER})
|
||||||
set(FFmpeg_HOST_CC ${CMAKE_C_HOST_COMPILER})
|
|
||||||
if (FFmpeg_IS_CROSS_COMPILING)
|
|
||||||
list(APPEND FFmpeg_CROSS_COMPILE_FLAGS --ld=${CMAKE_LINKER})
|
|
||||||
endif ()
|
|
||||||
# TODO: This is a bit fragile, it depends on FFmpeg_HWACCEL_LDFLAGS being a list
|
|
||||||
# whereas CMAKE_C_FLAGS (and likewise) is meant to NOT be a list, but rather
|
|
||||||
# an elongated piece of string
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${FFmpeg_MAKEFILE}
|
${FFmpeg_MAKEFILE}
|
||||||
@@ -307,12 +261,10 @@ else()
|
|||||||
--disable-avformat
|
--disable-avformat
|
||||||
--disable-doc
|
--disable-doc
|
||||||
--disable-everything
|
--disable-everything
|
||||||
--disable-autodetect
|
|
||||||
--disable-ffmpeg
|
--disable-ffmpeg
|
||||||
--disable-ffprobe
|
--disable-ffprobe
|
||||||
--disable-network
|
--disable-network
|
||||||
--disable-swresample
|
--disable-swresample
|
||||||
--disable-iconv
|
|
||||||
--enable-decoder=h264
|
--enable-decoder=h264
|
||||||
--enable-decoder=vp8
|
--enable-decoder=vp8
|
||||||
--enable-decoder=vp9
|
--enable-decoder=vp9
|
||||||
@@ -320,40 +272,45 @@ else()
|
|||||||
--enable-pic
|
--enable-pic
|
||||||
--cc=${FFmpeg_CC}
|
--cc=${FFmpeg_CC}
|
||||||
--cxx=${FFmpeg_CXX}
|
--cxx=${FFmpeg_CXX}
|
||||||
|
--ld=${CMAKE_LINKER}
|
||||||
--extra-cflags=${CMAKE_C_FLAGS}
|
--extra-cflags=${CMAKE_C_FLAGS}
|
||||||
--extra-cxxflags=${CMAKE_CXX_FLAGS}
|
--extra-cxxflags=${CMAKE_CXX_FLAGS}
|
||||||
--extra-ldflags="${FFmpeg_HWACCEL_LDFLAGS}"
|
--extra-ldflags=${CMAKE_C_LINK_FLAGS}
|
||||||
--host-cc=${FFmpeg_HOST_CC}
|
|
||||||
${FFmpeg_HWACCEL_FLAGS}
|
${FFmpeg_HWACCEL_FLAGS}
|
||||||
${FFmpeg_CROSS_COMPILE_FLAGS}
|
${FFmpeg_CROSS_COMPILE_FLAGS}
|
||||||
WORKING_DIRECTORY
|
WORKING_DIRECTORY
|
||||||
${FFmpeg_BUILD_DIR})
|
${FFmpeg_BUILD_DIR}
|
||||||
|
)
|
||||||
unset(FFmpeg_CC)
|
unset(FFmpeg_CC)
|
||||||
unset(FFmpeg_CXX)
|
unset(FFmpeg_CXX)
|
||||||
unset(FFmpeg_HOST_CC)
|
|
||||||
unset(FFmpeg_LD)
|
|
||||||
unset(FFmpeg_HWACCEL_FLAGS)
|
unset(FFmpeg_HWACCEL_FLAGS)
|
||||||
unset(FFmpeg_CROSS_COMPILE_FLAGS)
|
unset(FFmpeg_CROSS_COMPILE_FLAGS)
|
||||||
|
|
||||||
# Workaround for Ubuntu 18.04's older version of make not being able to call make as a child
|
# Workaround for Ubuntu 18.04's older version of make not being able to call make as a child
|
||||||
# with context of the jobserver. Also helps ninja users.
|
# with context of the jobserver. Also helps ninja users.
|
||||||
cmake_host_system_information(RESULT SYSTEM_THREADS QUERY NUMBER_OF_LOGICAL_CORES)
|
execute_process(
|
||||||
set(FFmpeg_MAKE_ARGS "")
|
COMMAND
|
||||||
if (DEFINED SYSTEM_THREADS)
|
nproc
|
||||||
set(FFmpeg_MAKE_ARGS -j ${SYSTEM_THREADS})
|
OUTPUT_VARIABLE
|
||||||
endif()
|
SYSTEM_THREADS)
|
||||||
|
|
||||||
set(FFmpeg_BUILD_LIBRARIES ${FFmpeg_LIBRARIES})
|
set(FFmpeg_BUILD_LIBRARIES ${FFmpeg_LIBRARIES})
|
||||||
|
|
||||||
# Most distros use 'gmake', Arch uses 'make'
|
# BSD make or Solaris make don't support ffmpeg make-j8
|
||||||
find_program(MAKE NAMES gmake make REQUIRED)
|
if (LINUX OR ANDROID OR APPLE OR WIN32 OR FREEBSD)
|
||||||
|
set(FFmpeg_MAKE_ARGS -j${SYSTEM_THREADS})
|
||||||
|
else()
|
||||||
|
set(FFmpeg_MAKE_ARGS "")
|
||||||
|
endif()
|
||||||
|
|
||||||
add_custom_command(
|
add_custom_command(
|
||||||
OUTPUT
|
OUTPUT
|
||||||
${FFmpeg_BUILD_LIBRARIES}
|
${FFmpeg_BUILD_LIBRARIES}
|
||||||
COMMAND
|
COMMAND
|
||||||
${MAKE} ${FFmpeg_MAKE_ARGS}
|
gmake ${FFmpeg_MAKE_ARGS}
|
||||||
WORKING_DIRECTORY
|
WORKING_DIRECTORY
|
||||||
${FFmpeg_BUILD_DIR})
|
${FFmpeg_BUILD_DIR}
|
||||||
|
)
|
||||||
|
|
||||||
set(FFmpeg_INCLUDE_DIR
|
set(FFmpeg_INCLUDE_DIR
|
||||||
"${FFmpeg_PREFIX};${FFmpeg_BUILD_DIR};${FFmpeg_HWACCEL_INCLUDE_DIRS}"
|
"${FFmpeg_PREFIX};${FFmpeg_BUILD_DIR};${FFmpeg_HWACCEL_INCLUDE_DIRS}"
|
||||||
@@ -375,10 +332,12 @@ else()
|
|||||||
unset(FFmpeg_HWACCEL_INCLUDE_DIRS)
|
unset(FFmpeg_HWACCEL_INCLUDE_DIRS)
|
||||||
unset(FFmpeg_HWACCEL_LDFLAGS)
|
unset(FFmpeg_HWACCEL_LDFLAGS)
|
||||||
unset(FFmpeg_HWACCEL_LIBRARIES)
|
unset(FFmpeg_HWACCEL_LIBRARIES)
|
||||||
endif()
|
|
||||||
unset(FFmpeg_COMPONENTS)
|
|
||||||
|
|
||||||
if (NOT FFmpeg_FOUND)
|
if (FFmpeg_FOUND)
|
||||||
|
message(STATUS "Found FFmpeg version ${FFmpeg_VERSION}")
|
||||||
|
else()
|
||||||
message(FATAL_ERROR "FFmpeg not found")
|
message(FATAL_ERROR "FFmpeg not found")
|
||||||
endif()
|
endif()
|
||||||
message(STATUS "Found FFmpeg version ${FFmpeg_VERSION}")
|
endif()
|
||||||
|
|
||||||
|
unset(FFmpeg_COMPONENTS)
|
||||||
|
|||||||
+1
-1
@@ -16,6 +16,7 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
RENDERER_USE_SPEED_LIMIT("use_speed_limit"),
|
||||||
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
USE_CUSTOM_CPU_TICKS("use_custom_cpu_ticks"),
|
||||||
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
SKIP_CPU_INNER_INVALIDATION("skip_cpu_inner_invalidation"),
|
||||||
|
NCE_INVALIDATION_GPU_READBACK("nce_invalidation_gpu_readback"),
|
||||||
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
FIX_BLOOM_EFFECTS("fix_bloom_effects"),
|
||||||
EMULATE_BGR565("emulate_bgr565"),
|
EMULATE_BGR565("emulate_bgr565"),
|
||||||
RESCALE_HACK("rescale_hack"),
|
RESCALE_HACK("rescale_hack"),
|
||||||
@@ -25,7 +26,6 @@ enum class BooleanSetting(override val key: String) : AbstractBooleanSetting {
|
|||||||
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
RENDERER_USE_DISK_SHADER_CACHE("use_disk_shader_cache"),
|
||||||
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
RENDERER_FORCE_MAX_CLOCK("force_max_clock"),
|
||||||
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
RENDERER_ASYNCHRONOUS_GPU_EMULATION("use_asynchronous_gpu_emulation"),
|
||||||
RENDERER_ASYNC_PRESENTATION("async_presentation"),
|
|
||||||
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
RENDERER_ASYNCHRONOUS_SHADERS("use_asynchronous_shaders"),
|
||||||
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
RENDERER_REACTIVE_FLUSHING("use_reactive_flushing"),
|
||||||
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
ENABLE_BUFFER_HISTORY("enable_buffer_history"),
|
||||||
|
|||||||
+7
-7
@@ -753,13 +753,6 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
descriptionId = R.string.renderer_asynchronous_gpu_emulation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
put(
|
|
||||||
SwitchSetting(
|
|
||||||
BooleanSetting.RENDERER_ASYNC_PRESENTATION,
|
|
||||||
titleId = R.string.renderer_async_presentation,
|
|
||||||
descriptionId = R.string.renderer_async_presentation_description
|
|
||||||
)
|
|
||||||
)
|
|
||||||
put(
|
put(
|
||||||
SingleChoiceSetting(
|
SingleChoiceSetting(
|
||||||
IntSetting.DMA_ACCURACY,
|
IntSetting.DMA_ACCURACY,
|
||||||
@@ -866,6 +859,13 @@ abstract class SettingsItem(
|
|||||||
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
descriptionId = R.string.skip_cpu_inner_invalidation_description
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
|
put(
|
||||||
|
SwitchSetting(
|
||||||
|
BooleanSetting.NCE_INVALIDATION_GPU_READBACK,
|
||||||
|
titleId = R.string.nce_invalidation_gpu_readback,
|
||||||
|
descriptionId = R.string.nce_invalidation_gpu_readback_description
|
||||||
|
)
|
||||||
|
)
|
||||||
put(
|
put(
|
||||||
SwitchSetting(
|
SwitchSetting(
|
||||||
BooleanSetting.FIX_BLOOM_EFFECTS,
|
BooleanSetting.FIX_BLOOM_EFFECTS,
|
||||||
|
|||||||
+1
-1
@@ -554,12 +554,12 @@ class SettingsFragmentPresenter(
|
|||||||
add(HeaderSetting(R.string.hacks))
|
add(HeaderSetting(R.string.hacks))
|
||||||
|
|
||||||
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
add(BooleanSetting.SKIP_CPU_INNER_INVALIDATION.key)
|
||||||
|
add(BooleanSetting.NCE_INVALIDATION_GPU_READBACK.key)
|
||||||
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
add(BooleanSetting.FIX_BLOOM_EFFECTS.key)
|
||||||
add(BooleanSetting.EMULATE_BGR565.key)
|
add(BooleanSetting.EMULATE_BGR565.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_SHADERS.key)
|
||||||
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
add(IntSetting.ANDROID_PIPELINE_WORKERS.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
add(BooleanSetting.RENDERER_ASYNCHRONOUS_GPU_EMULATION.key)
|
||||||
add(BooleanSetting.RENDERER_ASYNC_PRESENTATION.key)
|
|
||||||
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
add(SettingsItem.GPU_UNSWIZZLE_COMBINED)
|
||||||
|
|
||||||
add(HeaderSetting(R.string.extensions))
|
add(HeaderSetting(R.string.extensions))
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ import org.yuzu.yuzu_emu.model.Driver.Companion.toDriver
|
|||||||
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
import org.yuzu.yuzu_emu.utils.GpuDriverHelper
|
||||||
import org.yuzu.yuzu_emu.NativeLibrary
|
import org.yuzu.yuzu_emu.NativeLibrary
|
||||||
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
|
import org.yuzu.yuzu_emu.utils.GpuDriverMetadata
|
||||||
|
import org.yuzu.yuzu_emu.utils.DirectoryInitialization
|
||||||
import org.yuzu.yuzu_emu.utils.NativeConfig
|
import org.yuzu.yuzu_emu.utils.NativeConfig
|
||||||
import java.io.File
|
import java.io.File
|
||||||
|
|
||||||
@@ -146,11 +147,11 @@ class DriverViewModel : ViewModel() {
|
|||||||
private fun wipeGameShaders(game: Game) {
|
private fun wipeGameShaders(game: Game) {
|
||||||
viewModelScope.launch {
|
viewModelScope.launch {
|
||||||
withContext(Dispatchers.IO) {
|
withContext(Dispatchers.IO) {
|
||||||
val externalFilesDir = YuzuApplication.appContext.getExternalFilesDir(null)
|
val userDirectory = DirectoryInitialization.userDirectory
|
||||||
?: return@withContext
|
?: return@withContext
|
||||||
val shaderDir = File(
|
val shaderDir = File(
|
||||||
externalFilesDir.absolutePath +
|
userDirectory +
|
||||||
"/shader/" + game.settingsName.lowercase()
|
"/cache/shader/" + game.settingsName.lowercase()
|
||||||
)
|
)
|
||||||
if (shaderDir.exists()) {
|
if (shaderDir.exists()) {
|
||||||
shaderDir.deleteRecursively()
|
shaderDir.deleteRecursively()
|
||||||
|
|||||||
@@ -28,7 +28,7 @@
|
|||||||
<string name="input_overlay_behavior">السلوك</string>
|
<string name="input_overlay_behavior">السلوك</string>
|
||||||
<string name="overlay_auto_hide">إخفاء الطبقة تلقائيًا</string>
|
<string name="overlay_auto_hide">إخفاء الطبقة تلقائيًا</string>
|
||||||
<string name="overlay_auto_hide_description">إخفاء طبقة ذراع التحكم باللمس تلقائيًا بعد مرور الوقت المحدد من عدم النشاط.</string>
|
<string name="overlay_auto_hide_description">إخفاء طبقة ذراع التحكم باللمس تلقائيًا بعد مرور الوقت المحدد من عدم النشاط.</string>
|
||||||
<string name="enable_input_overlay_auto_hide">تمكين إخفاء الطبقة تلقائيًا</string>
|
<string name="enable_input_overlay_auto_hide">تفعيل إخفاء الطبقة تلقائيًا</string>
|
||||||
<string name="hide_overlay_on_controller_input">إخفاء الطبقة عند إدخال ذراع التحكم</string>
|
<string name="hide_overlay_on_controller_input">إخفاء الطبقة عند إدخال ذراع التحكم</string>
|
||||||
<string name="hide_overlay_on_controller_input_description">إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم.</string>
|
<string name="hide_overlay_on_controller_input_description">إخفاء تلقائي لطبقة عناصر التحكم باللمس عند استخدام ذراع تحكم فعلية. تظهر الطبقة مرة أخرى عند فصل ذراع التحكم.</string>
|
||||||
<string name="invert_confirm_back_controller_buttons">عكس أزرار التأكيد/الرجوع في وحدة التحكم</string>
|
<string name="invert_confirm_back_controller_buttons">عكس أزرار التأكيد/الرجوع في وحدة التحكم</string>
|
||||||
@@ -51,7 +51,7 @@
|
|||||||
<string name="stats_overlay_customization">التخصيص</string>
|
<string name="stats_overlay_customization">التخصيص</string>
|
||||||
<string name="stats_overlay_items">الرؤية</string>
|
<string name="stats_overlay_items">الرؤية</string>
|
||||||
<string name="stats_overlay_options">طبقة الأداء</string>
|
<string name="stats_overlay_options">طبقة الأداء</string>
|
||||||
<string name="enable_stats_overlay_">تمكين طبقة إحصائيات الأداء</string>
|
<string name="enable_stats_overlay_">تفعيل طبقة إحصائيات الأداء</string>
|
||||||
<string name="stats_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة إحصائيات الأداء</string>
|
<string name="stats_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة إحصائيات الأداء</string>
|
||||||
<string name="show_fps">عرض معدل الإطارات</string>
|
<string name="show_fps">عرض معدل الإطارات</string>
|
||||||
<string name="show_fps_description">عرض معدل الإطارات الحالي</string>
|
<string name="show_fps_description">عرض معدل الإطارات الحالي</string>
|
||||||
@@ -81,7 +81,7 @@
|
|||||||
|
|
||||||
<!-- Device Overlay settings -->
|
<!-- Device Overlay settings -->
|
||||||
<string name="show_soc_overlay">عرض طبقة معلومات الجهاز</string>
|
<string name="show_soc_overlay">عرض طبقة معلومات الجهاز</string>
|
||||||
<string name="enable_soc_overlay">تمكين طبقة الجهاز</string>
|
<string name="enable_soc_overlay">تفعيل طبقة الجهاز</string>
|
||||||
<string name="soc_overlay_options">طبقة الجهاز</string>
|
<string name="soc_overlay_options">طبقة الجهاز</string>
|
||||||
<string name="soc_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة الجهاز</string>
|
<string name="soc_overlay_options_description">ضبط المعلومات التي يتم عرضها في طبقة الجهاز</string>
|
||||||
|
|
||||||
@@ -98,8 +98,8 @@
|
|||||||
|
|
||||||
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
<string name="use_sync_core">مزامنة سرعة النواة</string>
|
||||||
<string name="use_sync_core_description">قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة.</string>
|
<string name="use_sync_core_description">قم بمزامنة سرعة النواة مع النسبة المئوية للسرعة القصوى لتحسين الأداء دون تغيير السرعة الفعلية للعبة.</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu">تمكين محاكاة MMU المضيف</string>
|
<string name="cpuopt_unsafe_host_mmu">تفعيل محاكاة MMU المضيف</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu_description">يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تمكينه إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية.</string>
|
<string name="cpuopt_unsafe_host_mmu_description">يعمل هذا التحسين على تسريع وصول الذاكرة بواسطة البرنامج الضيف. يؤدي تفعيله إلى إجراء عمليات قراءة/كتابة ذاكرة الضيف مباشرة في الذاكرة والاستفادة من MMU المضيف. يؤدي تعطيل هذا إلى إجبار جميع عمليات الوصول إلى الذاكرة على استخدام محاكاة MMU البرمجية.</string>
|
||||||
<string name="debug_knobs">مقابض تصحيح الأخطاء</string>
|
<string name="debug_knobs">مقابض تصحيح الأخطاء</string>
|
||||||
<string name="debug_knobs_description">للإستخدام في التطوير فقط.</string>
|
<string name="debug_knobs_description">للإستخدام في التطوير فقط.</string>
|
||||||
<string name="debug_knobs_hint">0 إلى 65535</string>
|
<string name="debug_knobs_hint">0 إلى 65535</string>
|
||||||
@@ -342,7 +342,7 @@
|
|||||||
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
<string name="frame_gen_flow_scale_description">دقة مسار التدفق البصري، كجزء من الناتج. ويُعد خفض هذه القيمة أرخص طريقة لاستعادة الأداء.</string>
|
||||||
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
<string name="frame_gen_unsupported">توليد الإطار غير متاح</string>
|
||||||
<string name="frame_gen_unsupported_description">يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling».</string>
|
<string name="frame_gen_unsupported_description">يفتقر برنامج تشغيل وحدة معالجة الرسومات هذا إلى نموذج ذاكرة Vulkan أو دعم الدقة النصفية (float16) التي تتطلبها برامج التظليل الخاصة بـ «Lossless Scaling».</string>
|
||||||
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتمكين إنشاء الإطارات لاحقًا</string>
|
<string name="lossless_scaling_setup_description">اختياري. قم بتوفير ملف Lossless.dll الخاص بك لتفعيل إنشاء الإطارات لاحقًا</string>
|
||||||
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
<string name="lossless_scaling_install">تثبيت ملف Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
<string name="lossless_scaling_install_description">يتطلب إنشاء الإطارات أن تكون لديك نسخة قانونية خاصة بك من ملف Lossless.dll المأخوذ من برنامج Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
<string name="lossless_scaling_replace_description">اختر نسخة أخرى من ملف Lossless.dll</string>
|
||||||
@@ -350,7 +350,7 @@
|
|||||||
<string name="frame_generation_supported">مدعوم</string>
|
<string name="frame_generation_supported">مدعوم</string>
|
||||||
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16)</string>
|
<string name="frame_generation_unsupported">غير مدعوم (لا يتوفر نموذج ذاكرة Vulkan أو float16)</string>
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتمكين توليد الإطارات</string>
|
<string name="lossless_scaling_description">قم بتوفير نسختك الخاصة من ملف Lossless.dll لتفعيل توليد الإطارات</string>
|
||||||
<string name="lossless_scaling_installed">مثبت</string>
|
<string name="lossless_scaling_installed">مثبت</string>
|
||||||
<string name="lossless_scaling_not_installed">غير مثبت</string>
|
<string name="lossless_scaling_not_installed">غير مثبت</string>
|
||||||
<string name="lossless_scaling_replace">استبدل</string>
|
<string name="lossless_scaling_replace">استبدل</string>
|
||||||
@@ -502,9 +502,9 @@
|
|||||||
<string name="frame_limit_slider">نسبة الحد الأقصى للسرعة</string>
|
<string name="frame_limit_slider">نسبة الحد الأقصى للسرعة</string>
|
||||||
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. %100 هي السرعة الطبيعية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة.</string>
|
<string name="frame_limit_slider_description">يحدد النسبة المئوية للحد من سرعة المحاكاة. %100 هي السرعة الطبيعية. القيم الأعلى أو الأقل ستزيد أو تقلل من الحد الأقصى للسرعة.</string>
|
||||||
<string name="turbo_speed_limit">سرعة تيربو</string>
|
<string name="turbo_speed_limit">سرعة تيربو</string>
|
||||||
<string name="turbo_speed_limit_description">عند تمكين وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
<string name="turbo_speed_limit_description">عند تفعيل وضع التيربو، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
||||||
<string name="slow_speed_limit">سرعة بطيئة</string>
|
<string name="slow_speed_limit">سرعة بطيئة</string>
|
||||||
<string name="slow_speed_limit_description">عند تمكين الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
<string name="slow_speed_limit_description">عند تفعيل الوضع البطيء، سيتم تشغيل المحاكاة بهذه السرعة.</string>
|
||||||
<string name="cpu_backend">خلفية وحدة المعالجة المركزية</string>
|
<string name="cpu_backend">خلفية وحدة المعالجة المركزية</string>
|
||||||
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
<string name="cpu_accuracy">دقة وحدة المعالجة المركزية</string>
|
||||||
<string name="value_with_units">%1$s%2$s</string>
|
<string name="value_with_units">%1$s%2$s</string>
|
||||||
@@ -574,11 +574,9 @@
|
|||||||
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
<string name="renderer_force_max_clock_description">يجبر وحدة معالجة الرسومات على العمل بأقصى سرعة ممكنة (سيظل يتم تطبيق القيود الحرارية).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
<string name="renderer_asynchronous_gpu_emulation">محاكاة غير متزامنة لوحدة معالجة الرسومات</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">يمكن لهذه الحيلة أن تزيد الأداء عن طريق تشغيل محاكاة وحدة معالجة الرسومات بشكل غير متزامن على حساب مشاكل الرسومات وزيادة معدلات الأعطال بسبب العمليات المتعلقة بالتوقيت.</string>
|
||||||
<string name="renderer_async_presentation">عرض غير متزامن</string>
|
|
||||||
<string name="renderer_async_presentation_description">يمكن لهذه الحيلة أن تزيد من الأداء عن طريق نقل عملية العرض إلى خيط معالجة منفصل على حساب مشاكل الرسوميات.</string>
|
|
||||||
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
<string name="renderer_reactive_flushing">استخدم التنظيف التفاعلي</string>
|
||||||
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
<string name="renderer_reactive_flushing_description">يحسن دقة العرض في بعض الألعاب على حساب الأداء.</string>
|
||||||
<string name="enable_buffer_history">تمكين سجل التخزين المؤقت</string>
|
<string name="enable_buffer_history">تفعيل سجل التخزين المؤقت</string>
|
||||||
<string name="enable_buffer_history_description">يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب.</string>
|
<string name="enable_buffer_history_description">يُتيح هذا الخيار الوصول إلى حالات التخزين المؤقت السابقة. وقد يُحسّن جودة العرض وثبات الأداء في بعض الألعاب.</string>
|
||||||
<string name="use_optimized_vertex_buffers">مخازن الرؤوس المُحسّنة</string>
|
<string name="use_optimized_vertex_buffers">مخازن الرؤوس المُحسّنة</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون).</string>
|
<string name="use_optimized_vertex_buffers_description">يُتيح ربطًا مُحسَّنًا لمخازن الرؤوس لتحسين الأداء. يتطلب برامج تشغيل Mesa 26.0+ Turnip/ برامج تشغيل QCOM. قد يتعطل على برامج تشغيل Turnip القديمة (25.3 وما دون).</string>
|
||||||
@@ -616,7 +614,7 @@
|
|||||||
<string name="dyna_state_description">يتحكم هذا الخيار في عدد الميزات التي يمكن استخدامها في ExtendedDynamicState (EDS). كلما زادت القيمة، قلّ عدد عمليات تجميع خط الأنابيب بناءً على الحالة الديناميكية التي يدعمها برنامج التشغيل.</string>
|
<string name="dyna_state_description">يتحكم هذا الخيار في عدد الميزات التي يمكن استخدامها في ExtendedDynamicState (EDS). كلما زادت القيمة، قلّ عدد عمليات تجميع خط الأنابيب بناءً على الحالة الديناميكية التي يدعمها برنامج التشغيل.</string>
|
||||||
<string name="disabled">معطل</string>
|
<string name="disabled">معطل</string>
|
||||||
<string name="vertex_input_dynamic_state">حالة ديناميكية لإدخال الرأس</string>
|
<string name="vertex_input_dynamic_state">حالة ديناميكية لإدخال الرأس</string>
|
||||||
<string name="vertex_input_dynamic_state_description">يتيح تمكين هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer.</string>
|
<string name="vertex_input_dynamic_state_description">يتيح تفعيل هذه الميزة معالجة أكثر مرونة لمدخلات الرؤوس، مما قد يقلل من وقت تجميع خط الأنابيب في vertex/buffer.</string>
|
||||||
<string name="sample_shading_fraction">تظليل العينة</string>
|
<string name="sample_shading_fraction">تظليل العينة</string>
|
||||||
<string name="sample_shading_fraction_description">يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء.</string>
|
<string name="sample_shading_fraction_description">يسمح هذا الخيار بتنفيذ مُظلل الأجزاء لكل عينة في جزء متعدد العينات بدلاً من تنفيذه مرة واحدة لكل جزء. يُحسّن هذا من جودة الرسومات على حساب بعض الأداء.</string>
|
||||||
|
|
||||||
@@ -825,9 +823,9 @@
|
|||||||
<string name="preferences_system">النظام</string>
|
<string name="preferences_system">النظام</string>
|
||||||
<string name="preferences_system_description">وضع الإرساء، المنطقة، اللغة</string>
|
<string name="preferences_system_description">وضع الإرساء، المنطقة، اللغة</string>
|
||||||
<string name="preferences_graphics">الرسومات</string>
|
<string name="preferences_graphics">الرسومات</string>
|
||||||
<string name="preferences_graphics_description">مستوى الدقة، الدقة، ذاكرة التخزين المؤقتة للتظليل</string>
|
<string name="preferences_graphics_description">مستوى دقة المحاكاة، الدقة، ذاكرة التخزين المؤقتة للتظليل</string>
|
||||||
<string name="quick_settings">الإعدادات السريعة</string>
|
<string name="quick_settings">الإعدادات السريعة</string>
|
||||||
<string name="enable_quick_settings">تمكين الإعدادات السريعة</string>
|
<string name="enable_quick_settings">تفعيل الإعدادات السريعة</string>
|
||||||
<string name="enable_quick_settings_description">السماح بالوصول إلى قائمة الإعدادات السريعة عن طريق التمرير و زر القائمة</string>
|
<string name="enable_quick_settings_description">السماح بالوصول إلى قائمة الإعدادات السريعة عن طريق التمرير و زر القائمة</string>
|
||||||
<string name="preferences_audio">الصوت</string>
|
<string name="preferences_audio">الصوت</string>
|
||||||
<string name="preferences_audio_description">محرك الإخراج، مستوى الصوت</string>
|
<string name="preferences_audio_description">محرك الإخراج، مستوى الصوت</string>
|
||||||
@@ -1223,8 +1221,8 @@
|
|||||||
<string name="airplane_mode">وضع الطيران</string>
|
<string name="airplane_mode">وضع الطيران</string>
|
||||||
<string name="airplane_mode_description">يمرر وضع الطيران إلى نظام تشغيل Switch</string>
|
<string name="airplane_mode_description">يمرر وضع الطيران إلى نظام تشغيل Switch</string>
|
||||||
|
|
||||||
<string name="enable_overlay">تمكين التطبيق الصغير للطبقة</string>
|
<string name="enable_overlay">تفعيل التطبيق الصغير للطبقة</string>
|
||||||
<string name="enable_overlay_description">تمكين التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره.</string>
|
<string name="enable_overlay_description">تفعيل التطبيق الصغير المدمج في Horizon. اضغط مع الاستمرار على زر الشاشة الرئيسية لمدة 1 ثانية لإظهاره.</string>
|
||||||
|
|
||||||
<!-- Profile Management -->
|
<!-- Profile Management -->
|
||||||
<string name="profile_manager">إدارة ملف التعريف</string>
|
<string name="profile_manager">إدارة ملف التعريف</string>
|
||||||
|
|||||||
@@ -518,8 +518,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
<string name="renderer_force_max_clock_description">Fuerza a la GPU a ejecutarse a la velocidad máxima de reloj posible (se seguirán aplicando restricciones térmicas).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
<string name="renderer_asynchronous_gpu_emulation">Emulación de GPU asíncrona</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Este hack puede aumentar el rendimiento ejecutando la emulación de la GPU de forma asíncrona, a costa de problemas gráficos y un aumento en la tasa de fallos debido a operaciones relacionadas con la sincronización.</string>
|
||||||
<string name="renderer_async_presentation">Presentación asíncrona</string>
|
|
||||||
<string name="renderer_async_presentation_description">Este hack puede aumentar el rendimiento al mover la presentación a un hilo independiente de la CPU a costa de problemas gráficos.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
<string name="renderer_reactive_flushing">Usar limpieza reactiva</string>
|
||||||
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
<string name="renderer_reactive_flushing_description">Mejora la precisión de renderizado en algunos juegos, pero reduce el rendimiento.</string>
|
||||||
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
<string name="enable_buffer_history">Activar el historial del búfer</string>
|
||||||
|
|||||||
@@ -563,8 +563,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
<string name="renderer_force_max_clock_description">Заставляет ГПУ работать на максимально возможных тактовых частотах (тепловые ограничения все равно будут применяться).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронная эмуляция ГПУ</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Может повысить производительность за счёт асинхронного запуска эмуляции ГПУ, но ценой появления графических ошибок и увеличения частоты вылетов из-за операций, зависящих от синхронизации.</string>
|
||||||
<string name="renderer_async_presentation">Асинхронная презентация</string>
|
|
||||||
<string name="renderer_async_presentation_description">Может повысить производительность за счёт перемещения вывода кадров в отдельный поток ЦП, но ценой возникновения графических проблем.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
<string name="renderer_reactive_flushing">Реактивная очистка</string>
|
||||||
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
<string name="renderer_reactive_flushing_description">Повышение точности рендеринга в некоторых играх за счет снижения производительности.</string>
|
||||||
<string name="enable_buffer_history">Включить историю буфера</string>
|
<string name="enable_buffer_history">Включить историю буфера</string>
|
||||||
|
|||||||
@@ -481,8 +481,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
<string name="renderer_force_max_clock_description">Змушує GPU працювати на максимальній тактовій частоті.</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
<string name="renderer_asynchronous_gpu_emulation">Асинхронна емуляція ГП</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">Це обхідне рішення може покращити продуктивність завдяки асинхронному виконанню емуляції ГП, але спричинить проблеми з графікою та збільшить частоту збоїв чутливих до таймінгів операцій.</string>
|
||||||
<string name="renderer_async_presentation">Асинхронне подання</string>
|
|
||||||
<string name="renderer_async_presentation_description">Це обхідне рішення може покращити продуктивність завдяки переміщенню подання на окремий потік ЦП, але спричинить проблеми з графікою.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
<string name="renderer_reactive_flushing">Реактивне очищення</string>
|
||||||
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
<string name="renderer_reactive_flushing_description">Покращує точність рендерингу в деяких іграх.</string>
|
||||||
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
<string name="enable_buffer_history">Увімкнути історію буфера</string>
|
||||||
|
|||||||
@@ -564,8 +564,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
<string name="renderer_force_max_clock_description">强制 GPU 以最大时钟运行 (温控依然生效)。</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 异步模拟</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此技巧可通过异步运行 GPU 模拟来提升性能,但在执行与时序相关的操作时,可能带来图形显示问题以及增加崩溃概率。</string>
|
||||||
<string name="renderer_async_presentation">异步呈现</string>
|
|
||||||
<string name="renderer_async_presentation_description">此技巧通过将图形呈现移至独立的 CPU 线程来提升性能,但可能会带来图形显示问题。</string>
|
|
||||||
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
<string name="renderer_reactive_flushing">启用反应性刷新</string>
|
||||||
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
<string name="renderer_reactive_flushing_description">通过牺牲性能来提升某些游戏的渲染精度。</string>
|
||||||
<string name="enable_buffer_history">启用缓冲区历史</string>
|
<string name="enable_buffer_history">启用缓冲区历史</string>
|
||||||
|
|||||||
@@ -16,7 +16,7 @@
|
|||||||
<string name="value_too_high">範圍最大必須為%1$d</string>
|
<string name="value_too_high">範圍最大必須為%1$d</string>
|
||||||
<string name="invalid_value">無效的範圍</string>
|
<string name="invalid_value">無效的範圍</string>
|
||||||
|
|
||||||
<string name="using_per_game_config">使用個別設定中</string>
|
<string name="using_per_game_config">使用個別遊戲設定中</string>
|
||||||
|
|
||||||
<!-- Input Overlay -->
|
<!-- Input Overlay -->
|
||||||
<string name="show_input_overlay">顯示虛擬按鍵</string>
|
<string name="show_input_overlay">顯示虛擬按鍵</string>
|
||||||
@@ -99,7 +99,7 @@
|
|||||||
<string name="use_sync_core">同步核心速度</string>
|
<string name="use_sync_core">同步核心速度</string>
|
||||||
<string name="use_sync_core_description">將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能</string>
|
<string name="use_sync_core_description">將核心速度與最大速度百分比同步,在不改變遊戲實際速度的情況下提高效能</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu">啟用主機MMU模擬</string>
|
<string name="cpuopt_unsafe_host_mmu">啟用主機MMU模擬</string>
|
||||||
<string name="cpuopt_unsafe_host_mmu_description">此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的 MMU。停用此功能將強制所有記憶體存取使用軟體 MMU 模擬。</string>
|
<string name="cpuopt_unsafe_host_mmu_description">此最佳化可加速客體程式的記憶體存取。啟用後,客體記憶體讀取/寫入將直接在記憶體中執行並利用主機的MMU。停用此功能將強制所有記憶體存取使用軟體MMU模擬</string>
|
||||||
<string name="debug_knobs">偵錯開關</string>
|
<string name="debug_knobs">偵錯開關</string>
|
||||||
<string name="debug_knobs_description">僅限開發用途</string>
|
<string name="debug_knobs_description">僅限開發用途</string>
|
||||||
<string name="debug_knobs_hint">0到65535</string>
|
<string name="debug_knobs_hint">0到65535</string>
|
||||||
@@ -151,7 +151,7 @@
|
|||||||
<string name="multiplayer_member_leave">%1$s 離開</string>
|
<string name="multiplayer_member_leave">%1$s 離開</string>
|
||||||
<string name="multiplayer_member_kicked">%1$s 被踢出</string>
|
<string name="multiplayer_member_kicked">%1$s 被踢出</string>
|
||||||
<string name="multiplayer_member_banned">%1$s 被封鎖</string>
|
<string name="multiplayer_member_banned">%1$s 被封鎖</string>
|
||||||
<string name="multiplayer_address_unbanned">位址已解封</string>
|
<string name="multiplayer_address_unbanned">IP位址已解封</string>
|
||||||
<string name="multiplayer_kick_member">踢出成員</string>
|
<string name="multiplayer_kick_member">踢出成員</string>
|
||||||
<string name="multiplayer_password">密碼</string>
|
<string name="multiplayer_password">密碼</string>
|
||||||
<string name="multiplayer_joining">正在加入…</string>
|
<string name="multiplayer_joining">正在加入…</string>
|
||||||
@@ -173,7 +173,7 @@
|
|||||||
<string name="multiplayer_ban">封鎖使用者</string>
|
<string name="multiplayer_ban">封鎖使用者</string>
|
||||||
<string name="multiplayer_room_browser">公開房間</string>
|
<string name="multiplayer_room_browser">公開房間</string>
|
||||||
<string name="multiplayer_no_rooms_found">未找到公開房間</string>
|
<string name="multiplayer_no_rooms_found">未找到公開房間</string>
|
||||||
<string name="multiplayer_password_required">需要輸入密碼</string>
|
<string name="multiplayer_password_required">請輸入密碼</string>
|
||||||
<string name="multiplayer_player_count">:%1$d/%2$d</string>
|
<string name="multiplayer_player_count">:%1$d/%2$d</string>
|
||||||
<string name="multiplayer_game">遊戲</string>
|
<string name="multiplayer_game">遊戲</string>
|
||||||
<string name="multiplayer_no_game_info">任意遊戲</string>
|
<string name="multiplayer_no_game_info">任意遊戲</string>
|
||||||
@@ -189,7 +189,7 @@
|
|||||||
<string name="multiplayer_token_required">需要Web令牌,請前往進階設定 -> 系統 -> 網路</string>
|
<string name="multiplayer_token_required">需要Web令牌,請前往進階設定 -> 系統 -> 網路</string>
|
||||||
<string name="multiplayer_ip_error">IP格式無效</string>
|
<string name="multiplayer_ip_error">IP格式無效</string>
|
||||||
<string name="multiplayer_username_error">必須介於4-20個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
<string name="multiplayer_username_error">必須介於4-20個字元之間,並且僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
||||||
<string name="multiplayer_nickname_invalid">使用者名稱無效,請在系統→網路中檢查設定</string>
|
<string name="multiplayer_nickname_invalid">使用者名稱無效,請在系統 -> 網路中檢查設定</string>
|
||||||
<string name="multiplayer_token_error">必須為48個字元,且僅包含小寫字母a-z</string>
|
<string name="multiplayer_token_error">必須為48個字元,且僅包含小寫字母a-z</string>
|
||||||
<string name="multiplayer_port_error">埠號需為1-65535</string>
|
<string name="multiplayer_port_error">埠號需為1-65535</string>
|
||||||
<string name="cancel">取消</string>
|
<string name="cancel">取消</string>
|
||||||
@@ -201,16 +201,16 @@
|
|||||||
|
|
||||||
<!-- Setup strings -->
|
<!-- Setup strings -->
|
||||||
<string name="welcome">歡迎!</string>
|
<string name="welcome">歡迎!</string>
|
||||||
<string name="welcome_description">瞭解如何設定 <b>Eden</b> 並開始模擬。</string>
|
<string name="welcome_description">瞭解如何設定 <b>Eden</b> 並開始模擬</string>
|
||||||
<string name="get_started">開始使用</string>
|
<string name="get_started">開始使用</string>
|
||||||
<string name="keys">金鑰</string>
|
<string name="keys">金鑰</string>
|
||||||
<string name="keys_description">使用下方的按鈕安裝您的 <b>prod.keys</b> 檔案。</string>
|
<string name="keys_description">使用下方的按鈕安裝您的 <b>prod.keys</b> 檔案</string>
|
||||||
<string name="firmware">韌體</string>
|
<string name="firmware">韌體</string>
|
||||||
<string name="firmware_description">使用下方的按鈕安裝您的<b>firmware.zip</b>檔案</string>
|
<string name="firmware_description">使用下方的按鈕安裝您的<b>firmware.zip</b>檔案</string>
|
||||||
<string name="games">遊戲資料夾</string>
|
<string name="games">遊戲資料夾</string>
|
||||||
<string name="games_description">使用下方的按鈕選擇您的<b>遊戲</b>資料夾。</string>
|
<string name="games_description">使用下方的按鈕選擇您的<b>遊戲</b>資料夾。</string>
|
||||||
<string name="done">完成</string>
|
<string name="done">完成</string>
|
||||||
<string name="done_description">您已準備就緒。\n盡情遊玩您的遊戲!</string>
|
<string name="done_description">您已準備就緒\n盡情遊玩您的遊戲!</string>
|
||||||
<string name="next">下一步</string>
|
<string name="next">下一步</string>
|
||||||
<string name="back">上一步</string>
|
<string name="back">上一步</string>
|
||||||
<string name="add_games">新增遊戲</string>
|
<string name="add_games">新增遊戲</string>
|
||||||
@@ -237,7 +237,7 @@
|
|||||||
<string name="update_install_failed">更新安裝失敗:%1$s</string>
|
<string name="update_install_failed">更新安裝失敗:%1$s</string>
|
||||||
<string name="home_search">搜尋</string>
|
<string name="home_search">搜尋</string>
|
||||||
<string name="home_settings">設定</string>
|
<string name="home_settings">設定</string>
|
||||||
<string name="empty_gamelist">找不到檔案,或者尚未選取遊戲目錄</string>
|
<string name="empty_gamelist">找不到遊戲檔案,或者尚未選取遊戲目錄</string>
|
||||||
<string name="manage_game_folders">管理遊戲資料夾</string>
|
<string name="manage_game_folders">管理遊戲資料夾</string>
|
||||||
<string name="select_games_folder_description">允許 Eden 尋找您的遊戲檔案</string>
|
<string name="select_games_folder_description">允許 Eden 尋找您的遊戲檔案</string>
|
||||||
<string name="add_games_warning">跳過選擇遊戲資料夾?</string>
|
<string name="add_games_warning">跳過選擇遊戲資料夾?</string>
|
||||||
@@ -287,7 +287,7 @@
|
|||||||
<string name="warning_skip">跳過</string>
|
<string name="warning_skip">跳過</string>
|
||||||
<string name="warning_cancel">取消</string>
|
<string name="warning_cancel">取消</string>
|
||||||
<string name="install_amiibo_keys">安裝 Amiibo 金鑰</string>
|
<string name="install_amiibo_keys">安裝 Amiibo 金鑰</string>
|
||||||
<string name="install_amiibo_keys_description">若要在遊戲中使用 Amiibo 得先安裝</string>
|
<string name="install_amiibo_keys_description">需要先安裝才能在遊戲中使用Amiibo</string>
|
||||||
<string name="gpu_driver_fetcher">GPU驅動程式下載器</string>
|
<string name="gpu_driver_fetcher">GPU驅動程式下載器</string>
|
||||||
<string name="gpu_driver_manager">GPU驅動程式管理員</string>
|
<string name="gpu_driver_manager">GPU驅動程式管理員</string>
|
||||||
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
<string name="install_gpu_driver_description">安裝替代驅動程式以取得潛在的更佳效能或準確度</string>
|
||||||
@@ -299,7 +299,7 @@
|
|||||||
<string name="post_processing_open_list">開啟清單</string>
|
<string name="post_processing_open_list">開啟清單</string>
|
||||||
<string name="post_processing_close_list">收起清單</string>
|
<string name="post_processing_close_list">收起清單</string>
|
||||||
<string name="post_processing_remove_all">移除效果</string>
|
<string name="post_processing_remove_all">移除效果</string>
|
||||||
<string name="post_processing_preset_locked">濾鏡已啟用。請在開啟遊戲前於 後製處理效果 中調整</string>
|
<string name="post_processing_preset_locked">濾鏡已啟用。請在開啟遊戲前於\"後製處理效果\"中調整</string>
|
||||||
<string name="post_processing_preset_modified">數值已變更,與原始濾鏡設定不同</string>
|
<string name="post_processing_preset_modified">數值已變更,與原始濾鏡設定不同</string>
|
||||||
<string name="post_processing_presets">濾鏡</string>
|
<string name="post_processing_presets">濾鏡</string>
|
||||||
<string name="post_processing_preset_new">新增濾鏡</string>
|
<string name="post_processing_preset_new">新增濾鏡</string>
|
||||||
@@ -314,40 +314,49 @@
|
|||||||
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
<string name="frame_gen_per_game_description">調整此遊戲的影格生成設定</string>
|
||||||
<string name="frame_gen_description">使用Lossless Scaling在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用FIFO垂直同步</string>
|
<string name="frame_gen_description">使用Lossless Scaling在已渲染的影格之間插入補間影格。啟用此功能時,會強制採用FIFO垂直同步</string>
|
||||||
<string name="frame_gen_multiplier">影格倍率</string>
|
<string name="frame_gen_multiplier">影格倍率</string>
|
||||||
<string name="frame_gen_multiplier_description">設定在每個已渲染的影格中要顯示的影格數。數值越高所需的 GPU 運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度</string>
|
<string name="frame_gen_multiplier_description">設定在每個已渲染的影格中要顯示的影格數,數值越高所需的GPU運算時間也會按比例增加。若要求的影格數超過裝置顯示器能呈現的數量將會降低模擬速度</string>
|
||||||
<string name="frame_gen_multiplier_2x">2x</string>
|
<string name="frame_gen_multiplier_2x">2x</string>
|
||||||
<string name="frame_gen_multiplier_3x">3x</string>
|
<string name="frame_gen_multiplier_3x">3x</string>
|
||||||
<string name="frame_gen_multiplier_4x">4x</string>
|
<string name="frame_gen_multiplier_4x">4x</string>
|
||||||
<string name="frame_gen_target_rate">目標影格率</string>
|
<string name="frame_gen_target_rate">目標影格率</string>
|
||||||
<string name="frame_gen_target_rate_description">選擇裝置顯示器能實際呈現的影格率。之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定</string>
|
<string name="frame_gen_target_rate_description">選擇裝置顯示器能實際呈現的影格率,之後倍率器會自動升高或降低以維持影格率。如果某個調整導致遊戲本身運作變慢,則會自動復原該設定</string>
|
||||||
<string name="frame_gen_target_rate_off">使用固定倍率</string>
|
<string name="frame_gen_target_rate_off">使用固定倍率</string>
|
||||||
<string name="frame_gen_target_rate_60">60 FPS</string>
|
<string name="frame_gen_target_rate_60">60 FPS</string>
|
||||||
<string name="frame_gen_target_rate_90">90 FPS</string>
|
<string name="frame_gen_target_rate_90">90 FPS</string>
|
||||||
<string name="frame_gen_target_rate_120">120 FPS</string>
|
<string name="frame_gen_target_rate_120">120 FPS</string>
|
||||||
|
<string name="frame_gen_on">開啟</string>
|
||||||
|
<string name="frame_gen_off">關閉</string>
|
||||||
|
<string name="frame_gen_fixed">固定</string>
|
||||||
|
<string name="frame_gen_flow_auto">自動</string>
|
||||||
|
<string name="frame_gen_quick_description">開啟或關閉影格生成後選擇影格倍率</string>
|
||||||
|
<string name="frame_gen_target_rate_quick_description">選擇要生成的目標影格率,倍率器會自動調整</string>
|
||||||
|
<string name="frame_gen_flow_scale_quick_description">用來預測影格之間動態的解析度,較低的數值可以減少GPU運算時間</string>
|
||||||
<string name="frame_gen_queue_target">影格佇列目標</string>
|
<string name="frame_gen_queue_target">影格佇列目標</string>
|
||||||
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
<string name="frame_gen_queue_target_description">最多允許多少個已完成的影格在顯示器前等待,較大的佇列可以吸收 GPU 突發負載,但會增加輸入延遲</string>
|
||||||
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
<string name="frame_gen_queue_target_0">最低延遲(無緩衝)</string>
|
||||||
<string name="frame_gen_queue_target_1">平衡(1影格)</string>
|
<string name="frame_gen_queue_target_1">平衡(1影格)</string>
|
||||||
<string name="frame_gen_queue_target_2">最流暢(2影格)</string>
|
<string name="frame_gen_queue_target_2">最流暢(2影格)</string>
|
||||||
<string name="frame_gen_flow_scale_auto">配合遊戲調整運動預測</string>
|
<string name="frame_gen_flow_scale_auto">配合遊戲調整運動預測</string>
|
||||||
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測。由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
<string name="frame_gen_flow_scale_auto_description">以遊戲實際渲染的解析度而非升頻後的輸出進行運動預測,由於升頻後不會增加任何動態細節,因此不會影響準確度</string>
|
||||||
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
<string name="frame_gen_flow_scale">運動預測解析度</string>
|
||||||
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示。降低此設定值是減少效能負載最有效的方法</string>
|
<string name="frame_gen_flow_scale_description">光流處理的解析度,以輸出解析度的比例表示,降低此設定值是減少效能負載最有效的方法</string>
|
||||||
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
<string name="frame_gen_unsupported">無法使用影格生成</string>
|
||||||
|
<string name="frame_gen_unsupported_description">此GPU驅動程式缺少Lossless Scaling著色器所需的Vulkan記憶體模型或半精度浮點數(float16)支援</string>
|
||||||
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
<string name="lossless_scaling_setup_description">可選擇安裝自己擁有的 Lossless.dll 以在之後啟用影格生成功能</string>
|
||||||
<string name="lossless_scaling_install">安裝 Lossless.dll</string>
|
<string name="lossless_scaling_install">安裝 Lossless.dll</string>
|
||||||
<string name="lossless_scaling_install_description">您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能</string>
|
<string name="lossless_scaling_install_description">您需要擁有從合法管道獲得的 Lossless Scaling 並從該軟體的資料夾中取得 Lossless.dll 檔案才能使用影格生成功能</string>
|
||||||
<string name="lossless_scaling_replace_description">安裝不同的 Lossless.dll 檔案</string>
|
<string name="lossless_scaling_replace_description">安裝不同的 Lossless.dll 檔案</string>
|
||||||
<string name="frame_generation_support">影格生成</string>
|
<string name="frame_generation_support">影格生成</string>
|
||||||
<string name="frame_generation_supported">支援</string>
|
<string name="frame_generation_supported">支援</string>
|
||||||
|
<string name="frame_generation_unsupported">不支援(無Vulkan記憶體模型或float16)</string>
|
||||||
<string name="lossless_scaling">Lossless Scaling</string>
|
<string name="lossless_scaling">Lossless Scaling</string>
|
||||||
<string name="lossless_scaling_description">安裝您擁有的Lossless.dll檔案以使用影格生成</string>
|
<string name="lossless_scaling_description">安裝您擁有的Lossless.dll檔案以使用影格生成</string>
|
||||||
<string name="lossless_scaling_installed">已安裝</string>
|
<string name="lossless_scaling_installed">已安裝</string>
|
||||||
<string name="lossless_scaling_not_installed">未安裝</string>
|
<string name="lossless_scaling_not_installed">未安裝</string>
|
||||||
<string name="lossless_scaling_replace">替換</string>
|
<string name="lossless_scaling_replace">更換</string>
|
||||||
<string name="lossless_scaling_remove">刪除</string>
|
<string name="lossless_scaling_remove">刪除</string>
|
||||||
<string name="lossless_scaling_remove_description">刪除已安裝的Lossless.dll及預先編譯的著色器</string>
|
<string name="lossless_scaling_remove_description">刪除已安裝的Lossless.dll及預先編譯的著色器</string>
|
||||||
<string name="lossless_scaling_remove_confirmation">影格生成功能會停止運作直到您重新安裝 Lossless.dll 。您的 Lossless.dll 原始檔並不會被 Eden 修改</string>
|
<string name="lossless_scaling_remove_confirmation">影格生成功能會停止運作直到您重新安裝Lossless.dll,您的Lossless.dll原始檔不會被 Eden 修改</string>
|
||||||
<string name="lossless_scaling_missing">Lossless.dll 未安裝</string>
|
<string name="lossless_scaling_missing">Lossless.dll 未安裝</string>
|
||||||
<string name="lossless_scaling_missing_description">前往 設定 -> Lossless Scaling 安裝以使用影格生成功能</string>
|
<string name="lossless_scaling_missing_description">前往 設定 -> Lossless Scaling 安裝以使用影格生成功能</string>
|
||||||
<string name="lossless_scaling_locked">請先關閉遊戲</string>
|
<string name="lossless_scaling_locked">請先關閉遊戲</string>
|
||||||
@@ -360,9 +369,9 @@
|
|||||||
<string name="error_lossless_copy_failed">無法複製選取的檔案</string>
|
<string name="error_lossless_copy_failed">無法複製選取的檔案</string>
|
||||||
<string name="error_lossless_unreadable">無法讀取選取的檔案</string>
|
<string name="error_lossless_unreadable">無法讀取選取的檔案</string>
|
||||||
<string name="error_lossless_not_pe">選取的檔案並不是Windows程式庫。請在Lossless Scaling的安裝位置(資料夾)中選擇Lossless.dll</string>
|
<string name="error_lossless_not_pe">選取的檔案並不是Windows程式庫。請在Lossless Scaling的安裝位置(資料夾)中選擇Lossless.dll</string>
|
||||||
<string name="error_lossless_missing_shaders">這個 Lossless.dll 的副本並未包含影格生成著色器。請更新 Lossless Scaling 後再試一次</string>
|
<string name="error_lossless_missing_shaders">這個Lossless.dll的副本並未包含影格生成著色器。請更新Lossless Scaling後重試</string>
|
||||||
<string name="error_lossless_translation_failed">無法轉譯影格生成著色器。尚不支援此 Lossless Scaling 版本</string>
|
<string name="error_lossless_translation_failed">無法轉譯影格生成著色器,尚不支援此Lossless Scaling版本</string>
|
||||||
<string name="error_lossless_cache_failed">轉譯的著色器無法寫入到儲存空間。請確認手機容量是否充足</string>
|
<string name="error_lossless_cache_failed">轉譯的著色器無法寫入到儲存空間,請確認手機容量是否充足</string>
|
||||||
<string name="advanced_settings">進階設定</string>
|
<string name="advanced_settings">進階設定</string>
|
||||||
<string name="settings_description">調整模擬器設定</string>
|
<string name="settings_description">調整模擬器設定</string>
|
||||||
<string name="search_recently_played">最近遊玩</string>
|
<string name="search_recently_played">最近遊玩</string>
|
||||||
@@ -386,7 +395,7 @@
|
|||||||
<string name="install_firmware_description">韌體必須為ZIP壓縮檔,將會用於部分遊戲的啟動</string>
|
<string name="install_firmware_description">韌體必須為ZIP壓縮檔,將會用於部分遊戲的啟動</string>
|
||||||
<string name="firmware_installing">正在安裝韌體</string>
|
<string name="firmware_installing">正在安裝韌體</string>
|
||||||
<string name="firmware_installed_failure">韌體安裝失敗</string>
|
<string name="firmware_installed_failure">韌體安裝失敗</string>
|
||||||
<string name="firmware_installed_failure_description">請確保韌體 nca 檔案位於 zip 壓縮檔的根目錄,然後再試一次。</string>
|
<string name="firmware_installed_failure_description">請確保韌體nca檔案位於zip壓縮檔的根目錄後再試一次</string>
|
||||||
<string name="firmware_uninstalled_failure">韌體解除安裝失敗</string>
|
<string name="firmware_uninstalled_failure">韌體解除安裝失敗</string>
|
||||||
<string name="share_log">分享偵錯記錄</string>
|
<string name="share_log">分享偵錯記錄</string>
|
||||||
<string name="share_log_description">分享Eden的記錄檔以便對相關問題進行偵錯</string>
|
<string name="share_log_description">分享Eden的記錄檔以便對相關問題進行偵錯</string>
|
||||||
@@ -406,7 +415,7 @@
|
|||||||
<string name="install_game_content_success_overwrite">%1$d 覆寫成功</string>
|
<string name="install_game_content_success_overwrite">%1$d 覆寫成功</string>
|
||||||
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
|
<string name="install_game_content_help_link">https://yuzu-mirror.github.io/help/quickstart/#dumping-installed-updates</string>
|
||||||
<string name="custom_driver_not_supported">您的裝置不支援自訂驅動程式</string>
|
<string name="custom_driver_not_supported">您的裝置不支援自訂驅動程式</string>
|
||||||
<string name="custom_driver_not_supported_description">此裝置不支援注入自訂驅動程式。\n請以後再來查看是否已新增支援!</string>
|
<string name="custom_driver_not_supported_description">此裝置不支援注入自訂驅動程式\n請以後再來查看是否已新增支援!</string>
|
||||||
<string name="manage_yuzu_data">管理Eden資料</string>
|
<string name="manage_yuzu_data">管理Eden資料</string>
|
||||||
<string name="manage_yuzu_data_description">安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目!</string>
|
<string name="manage_yuzu_data_description">安裝韌體、金鑰,導入/導出使用者資料及安裝其它項目!</string>
|
||||||
<string name="game_folders">遊戲資料夾</string>
|
<string name="game_folders">遊戲資料夾</string>
|
||||||
@@ -437,8 +446,8 @@
|
|||||||
<string name="keys_failed">金鑰安裝失敗</string>
|
<string name="keys_failed">金鑰安裝失敗</string>
|
||||||
<string name="keys_install_success">金鑰安裝成功</string>
|
<string name="keys_install_success">金鑰安裝成功</string>
|
||||||
<string name="error_keys_copy_failed">一個或多個金鑰安裝失敗</string>
|
<string name="error_keys_copy_failed">一個或多個金鑰安裝失敗</string>
|
||||||
<string name="error_keys_invalid_filename">請確保金鑰檔案具有.keys副檔名後重試。</string>
|
<string name="error_keys_invalid_filename">請確保金鑰檔案具有.keys副檔名後重試</string>
|
||||||
<string name="error_keys_failed_init">金鑰初始化失敗。請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰。</string>
|
<string name="error_keys_failed_init">金鑰初始化失敗,請檢查您的轉儲工具是否為最新版本並重新轉儲金鑰</string>
|
||||||
|
|
||||||
<!-- Applet launcher strings -->
|
<!-- Applet launcher strings -->
|
||||||
<string name="qlaunch_applet">Qlaunch</string>
|
<string name="qlaunch_applet">Qlaunch</string>
|
||||||
@@ -469,19 +478,19 @@
|
|||||||
<string name="licenses_description">這些專案使Eden Android版成為可能</string>
|
<string name="licenses_description">這些專案使Eden Android版成為可能</string>
|
||||||
<string name="build">組建版本</string>
|
<string name="build">組建版本</string>
|
||||||
<string name="user_data">使用者資料</string>
|
<string name="user_data">使用者資料</string>
|
||||||
<string name="user_data_description">導入/導出所有應用程式資料。\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料。</string>
|
<string name="user_data_description">導入/導出所有應用程式資料\n\n導入使用者資料時,現有的使用者資料將被取代!\n\n直接從 Citron 導入使用者資料可能會出現問題,建議手動導入所有所需資料</string>
|
||||||
<string name="exporting_user_data">正在導出使用者資料…</string>
|
<string name="exporting_user_data">正在導出使用者資料…</string>
|
||||||
<string name="importing_user_data">正在導入使用者資料…</string>
|
<string name="importing_user_data">正在導入使用者資料…</string>
|
||||||
<string name="invalid_yuzu_backup">無效的Eden備份</string>
|
<string name="invalid_yuzu_backup">無效的Eden備份</string>
|
||||||
<string name="user_data_export_success">使用者資料導出成功</string>
|
<string name="user_data_export_success">使用者資料導出成功</string>
|
||||||
<string name="user_data_import_success">使用者資料導入成功</string>
|
<string name="user_data_import_success">使用者資料導入成功</string>
|
||||||
<string name="user_data_export_cancelled">導出已取消</string>
|
<string name="user_data_export_cancelled">導出已取消</string>
|
||||||
<string name="user_data_import_failed_description">請確保使用者資料夾位於 zip 壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案,並再試一次</string>
|
<string name="user_data_import_failed_description">請確保使用者資料夾位於zip壓縮檔的根目錄,並在 config/config.ini 路徑中包含組態檔案後重試</string>
|
||||||
<!-- General settings strings -->
|
<!-- General settings strings -->
|
||||||
<string name="frame_limit_enable">限制模擬速度</string>
|
<string name="frame_limit_enable">限制模擬速度</string>
|
||||||
<string name="frame_limit_enable_description">將模擬速度限制在標準速度的指定百分比</string>
|
<string name="frame_limit_enable_description">將模擬速度限制在標準速度的指定百分比</string>
|
||||||
<string name="frame_limit_slider">限制速度百分比</string>
|
<string name="frame_limit_slider">限制速度百分比</string>
|
||||||
<string name="frame_limit_slider_description">指定模擬速度的百分比。100% 為標準速度,更高或更低的值將會減少或增加速度限制</string>
|
<string name="frame_limit_slider_description">指定模擬速度的百分比,100%為標準速度,更高或更低的值將會減少或增加速度限制</string>
|
||||||
<string name="turbo_speed_limit">加速模式</string>
|
<string name="turbo_speed_limit">加速模式</string>
|
||||||
<string name="turbo_speed_limit_description">當開啟加速模式時,模擬器將以此速度執行</string>
|
<string name="turbo_speed_limit_description">當開啟加速模式時,模擬器將以此速度執行</string>
|
||||||
<string name="slow_speed_limit">慢速模式</string>
|
<string name="slow_speed_limit">慢速模式</string>
|
||||||
@@ -509,16 +518,16 @@
|
|||||||
<string name="fast_cpu_time">CPU時脈</string>
|
<string name="fast_cpu_time">CPU時脈</string>
|
||||||
<string name="fast_cpu_time_description">提高模擬CPU回報的時脈,可以減少某些FPS限制。較弱的CPU可能會出現效能下降的情況,部分遊戲可能會出現異常</string>
|
<string name="fast_cpu_time_description">提高模擬CPU回報的時脈,可以減少某些FPS限制。較弱的CPU可能會出現效能下降的情況,部分遊戲可能會出現異常</string>
|
||||||
<string name="custom_cpu_ticks">自訂CPU時脈</string>
|
<string name="custom_cpu_ticks">自訂CPU時脈</string>
|
||||||
<string name="custom_cpu_ticks_description">自訂CPU時脈。更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000。</string>
|
<string name="custom_cpu_ticks_description">自訂CPU時脈,更高的值可能提高效能,但也可能導致遊戲卡死。建議範圍為77-21000</string>
|
||||||
<string name="cpu_ticks">時脈</string>
|
<string name="cpu_ticks">時脈</string>
|
||||||
<string name="memory_layout">記憶體佈局</string>
|
<string name="memory_layout">記憶體布局</string>
|
||||||
<string name="memory_layout_description">(實驗性)更改模擬記憶體佈局。此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在 RAM 為 8GB 或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為 Dynarmic (JIT)</string>
|
<string name="memory_layout_description">(實驗性)更改模擬記憶體布局,此設定不會提高效能,但可能有助於使用模組來提高解析度的遊戲的載入。不要在RAM為8GB或更少的手機上使用。若遊戲崩潰請將進階設定裡偵錯選項中的CPU後端改為Dynarmic (JIT)</string>
|
||||||
|
|
||||||
<string name="generate">生成</string>
|
<string name="generate">生成</string>
|
||||||
|
|
||||||
<!-- Network settings strings -->
|
<!-- Network settings strings -->
|
||||||
<string name="web_token">網路令牌</string>
|
<string name="web_token">網路令牌</string>
|
||||||
<string name="web_token_description">用於建立公開大廳的網路令牌。由48個小寫字母a-z組成</string>
|
<string name="web_token_description">用於建立公開大廳的網路令牌,由48個小寫字母a-z組成</string>
|
||||||
<string name="web_username">網路使用者名稱</string>
|
<string name="web_username">網路使用者名稱</string>
|
||||||
<string name="web_username_description">多人遊戲房間中顯示的使用者名稱。必須為4-20個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
<string name="web_username_description">多人遊戲房間中顯示的使用者名稱。必須為4-20個字元,僅能使用英文字母、數字、句點、破折號、底線和空格(標點符號須為英文格式)</string>
|
||||||
<string name="network">網路</string>
|
<string name="network">網路</string>
|
||||||
@@ -535,11 +544,11 @@
|
|||||||
<string name="advanced">進階</string>
|
<string name="advanced">進階</string>
|
||||||
|
|
||||||
<string name="renderer_accuracy">GPU模式</string>
|
<string name="renderer_accuracy">GPU模式</string>
|
||||||
<string name="renderer_accuracy_description">設定 GPU 模擬的準確度。大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤</string>
|
<string name="renderer_accuracy_description">設定GPU模擬的準確度,大多數遊戲在設定為快速時即可正常渲染,但有些需要渲染粒子的遊戲仍需設為準確來避免圖形錯誤</string>
|
||||||
<string name="dma_accuracy">DMA準確度</string>
|
<string name="dma_accuracy">DMA準確度</string>
|
||||||
<string name="dma_accuracy_description">控制 DMA 準確度。將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設</string>
|
<string name="dma_accuracy_description">控制DMA準確度,將準確度設為穩定可以修復某些遊戲中的問題,但在某些情況下也可能影響效能。如果不確定,請保留為預設</string>
|
||||||
<string name="gpu_fence_behavior">GPU 同步柵欄模式</string>
|
<string name="gpu_fence_behavior">GPU 同步柵欄模式</string>
|
||||||
<string name="gpu_fence_behavior_description">控制 GPU 同步柵欄模式。即時是速度最快的選項,但可能會導致一些問題。使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤。準確則是在犧牲部分效能的情況下進一步提升相容性。嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題。預設則會依照 GPU 準確度設定</string>
|
<string name="gpu_fence_behavior_description">控制 GPU 同步柵欄模式,即時是速度最快的選項,但可能會導致一些問題;使用平衡可以提供更好的相容性並修復某些遊戲中的錯誤;準確則是在犧牲部分效能的情況下進一步提升相容性;嚴格是最慢的選項,但可以修復那些對同步要求更嚴格的遊戲中的問題;預設則會依照 GPU 準確度設定</string>
|
||||||
<string name="anisotropic_filtering">各向異性過濾</string>
|
<string name="anisotropic_filtering">各向異性過濾</string>
|
||||||
<string name="anisotropic_filtering_description">改善斜角檢視時的紋理品質</string>
|
<string name="anisotropic_filtering_description">改善斜角檢視時的紋理品質</string>
|
||||||
<string name="vram_usage_mode">VRAM使用模式</string>
|
<string name="vram_usage_mode">VRAM使用模式</string>
|
||||||
@@ -548,21 +557,19 @@
|
|||||||
<string name="accelerate_astc_description">選擇ASTC壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題)</string>
|
<string name="accelerate_astc_description">選擇ASTC壓縮紋理的解碼方式:CPU(慢速、穩定)、GPU(快速、推薦)或CPU非同步(無卡頓,可能導致問題)</string>
|
||||||
|
|
||||||
<string name="sync_memory_operations">同步記憶體操作</string>
|
<string name="sync_memory_operations">同步記憶體操作</string>
|
||||||
<string name="sync_memory_operations_description">確保計算和記憶體操作之間的資料一致性。 此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。 使用Unreal Engine 4的遊戲似乎受影響最大</string>
|
<string name="sync_memory_operations_description">確保計算和記憶體操作之間的資料一致性,此選項應能修復某些遊戲中的問題,但在某些情況下可能會降低效能。使用Unreal Engine 4的遊戲似乎受影響最大</string>
|
||||||
<string name="use_disk_shader_cache">磁碟著色器快取</string>
|
<string name="use_disk_shader_cache">磁碟著色器快取</string>
|
||||||
<string name="use_disk_shader_cache_description">將產生的著色器快取儲存至硬碟以減少中斷</string>
|
<string name="use_disk_shader_cache_description">將產生的著色器快取儲存至硬碟以減少中斷</string>
|
||||||
<string name="renderer_force_max_clock">強制使用最大時脈 (僅限Adreno)</string>
|
<string name="renderer_force_max_clock">強制使用最大時脈 (僅限Adreno)</string>
|
||||||
<string name="renderer_force_max_clock_description">強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用)</string>
|
<string name="renderer_force_max_clock_description">強制 GPU 以可能的最大時脈執行 (熱溫限制仍會被套用)</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU 非同步模擬</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">此修改可透過使用 GPU 非同步模擬來提升性能,不過可能會導致圖形問題且會提高在進行時序相關操作時當機的機率</string>
|
||||||
<string name="renderer_async_presentation">非同步呈現</string>
|
|
||||||
<string name="renderer_async_presentation_description">此修改可以透過將渲染移至單獨的 CPU 執行緒來提升性能,但可能會導致圖形問題</string>
|
|
||||||
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
<string name="renderer_reactive_flushing">使用重新啟用排清</string>
|
||||||
<string name="renderer_reactive_flushing_description">犧牲效能,以改善部分遊戲的轉譯準確度</string>
|
<string name="renderer_reactive_flushing_description">犧牲效能以改善部分遊戲的轉譯準確度</string>
|
||||||
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
<string name="enable_buffer_history">啟用緩衝區歷史</string>
|
||||||
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態。此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
<string name="enable_buffer_history_description">允許存取先前的緩衝區狀態,此選項可能會改善部分遊戲的渲染品質與效能穩定性</string>
|
||||||
<string name="use_optimized_vertex_buffers">最佳化頂點緩衝區</string>
|
<string name="use_optimized_vertex_buffers">最佳化頂點緩衝區</string>
|
||||||
<string name="use_optimized_vertex_buffers_description">啟用最佳化的頂點緩衝區綁定。需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機 (25.3版和更低的版本)</string>
|
<string name="use_optimized_vertex_buffers_description">啟用最佳化的頂點緩衝區綁定,需要安裝 Mesa 26.0+ Turnip drivers/Qualcomm drivers。使用舊版 Turnip drivers 會導致當機(25.3版和更低的版本)</string>
|
||||||
|
|
||||||
<string name="hacks">修改</string>
|
<string name="hacks">修改</string>
|
||||||
|
|
||||||
@@ -571,30 +578,30 @@
|
|||||||
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
|
<string name="skip_cpu_inner_invalidation">跳過CPU內部失效處理</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機</string>
|
<string name="skip_cpu_inner_invalidation_description">在記憶體更新期間跳過某些CPU端快取的失效處理,減少CPU使用率並提高其性能。可能會導致某些遊戲出現故障或當機</string>
|
||||||
<string name="fix_bloom_effects">修正光暈特效</string>
|
<string name="fix_bloom_effects">修正光暈特效</string>
|
||||||
<string name="fix_bloom_effects_description">在 薩爾達傳說:織夢島 和 薩爾達傳說:智慧的再現 中 減少光暈模糊的問題並移除 橫衝直撞:狂飆樂園重製版 中的光暈效果 (Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
<string name="fix_bloom_effects_description">在 \"薩爾達傳說:織夢島\" 和 \"薩爾達傳說:智慧的再現\" 中減少光暈模糊的問題並移除 \"橫衝直撞:狂飆樂園重製版\" 中的光暈效果(適用於Adreno A6XX - A7XX/ Turnip)。警告:可能會在其它遊戲中導致圖形異常</string>
|
||||||
<string name="emulate_bgr565">模擬BGR565</string>
|
<string name="emulate_bgr565">模擬BGR565</string>
|
||||||
<string name="emulate_bgr565_description">修正遊戲中出現的顏色反轉、圖形異常或陰影異常</string>
|
<string name="emulate_bgr565_description">修正遊戲中出現的色彩反轉、圖形異常或陰影異常</string>
|
||||||
<string name="rescale_hack">啟用舊版重新縮放處理</string>
|
<string name="rescale_hack">啟用舊版重新縮放處理</string>
|
||||||
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
<string name="rescale_hack_description">透過快速重新縮放處理來啟用遊戲重新縮放設定階段的舊版處理方式</string>
|
||||||
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
<string name="renderer_asynchronous_shaders">使用非同步著色器</string>
|
||||||
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器。這可能會減少卡頓,但也可能導致圖形錯誤。</string>
|
<string name="renderer_asynchronous_shaders_description">使用非同步編譯著色器,這可能會減少卡頓,但也可能導致圖形錯誤</string>
|
||||||
<string name="gpu_unswizzle_settings">GPU Unswizzle設定</string>
|
<string name="gpu_unswizzle_settings">GPU Unswizzle設定</string>
|
||||||
<string name="gpu_unswizzle_settings_description">設定基於 GPU 的 Unswizzling 參數或完全停用此功能。調整此設定以在性能與紋理載入品質中取得平衡</string>
|
<string name="gpu_unswizzle_settings_description">設定基於GPU的Unswizzling參數或完全停用此功能,調整此設定以在性能與紋理載入品質中取得平衡</string>
|
||||||
<string name="gpu_unswizzle_enable">啟用GPU Unswizzle</string>
|
<string name="gpu_unswizzle_enable">啟用GPU Unswizzle</string>
|
||||||
<string name="gpu_unswizzle_disabled">停用</string>
|
<string name="gpu_unswizzle_disabled">停用</string>
|
||||||
<string name="gpu_unswizzle_texture_size">GPU Unswizzle最大紋理尺寸</string>
|
<string name="gpu_unswizzle_texture_size">GPU Unswizzle最大紋理尺寸</string>
|
||||||
<string name="gpu_unswizzle_texture_size_description">設定 GPU 紋理 Unswizzling 的最大值 (MB)。雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。整此設定以在 GPU 加速與 CPU 負載之間取得平衡</string>
|
<string name="gpu_unswizzle_texture_size_description">設定 GPU 紋理 Unswizzling 的最大值(MB),雖然 GPU 處理中型和大型紋理的速度較快,但 CPU 處理非常小的紋理可能更有效率。調整此設定以在GPU加速與CPU負載之間取得平衡</string>
|
||||||
<string name="gpu_unswizzle_stream_size">GPU Unswizzle 流大小</string>
|
<string name="gpu_unswizzle_stream_size">GPU Unswizzle Stream大小</string>
|
||||||
<string name="gpu_unswizzle_stream_size_description">設定每個影格處理大型紋理 Unswizzling 的資料上限。數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現</string>
|
<string name="gpu_unswizzle_stream_size_description">設定每個影格處理大型紋理Unswizzling的資料上限,數值越高載入紋理的速度越快,但會增加畫面延遲;數值較低則能降低 GPU 負載,不過有可能導致至紋理載入不完全甚至突然出現</string>
|
||||||
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle 塊大小</string>
|
<string name="gpu_unswizzle_chunk_size">GPU Unswizzle Chunk大小</string>
|
||||||
<string name="gpu_unswizzle_chunk_size_description">設定 3D 紋理每批次處理的深度切片數量。增加此數值可提升規格較佳 GPU 的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時</string>
|
<string name="gpu_unswizzle_chunk_size_description">設定 3D 紋理每批次處理的深度切片數量,增加此數值可提升規格較佳GPU的處理效率,但在較低規格的硬體上可能導致卡頓或驅動程式逾時</string>
|
||||||
<string name="gpu_unswizzle_default_button">預設</string>
|
<string name="gpu_unswizzle_default_button">預設</string>
|
||||||
|
|
||||||
|
|
||||||
<string name="extensions">擴充功能</string>
|
<string name="extensions">擴充功能</string>
|
||||||
|
|
||||||
<string name="dyna_state">擴展動態狀態</string>
|
<string name="dyna_state">擴展動態狀態</string>
|
||||||
<string name="dyna_state_description">控制擴展動態狀態中可使用的功能數量。較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數。</string>
|
<string name="dyna_state_description">控制擴展動態狀態中可使用的功能數量,較高的數值可根據驅動程式支援的動態狀態減少管線編譯的次數</string>
|
||||||
<string name="disabled">停用</string>
|
<string name="disabled">停用</string>
|
||||||
<string name="vertex_input_dynamic_state">頂點輸入動態狀態</string>
|
<string name="vertex_input_dynamic_state">頂點輸入動態狀態</string>
|
||||||
<string name="vertex_input_dynamic_state_description">啟用此功能可提供更彈性的頂點輸入處理方式,並可能減少頂點/緩衝區的管線編譯時間</string>
|
<string name="vertex_input_dynamic_state_description">啟用此功能可提供更彈性的頂點輸入處理方式,並可能減少頂點/緩衝區的管線編譯時間</string>
|
||||||
@@ -616,19 +623,19 @@
|
|||||||
<string name="cpu">CPU</string>
|
<string name="cpu">CPU</string>
|
||||||
<string name="clocks">時脈</string>
|
<string name="clocks">時脈</string>
|
||||||
<string name="use_auto_stub">使用自動存根</string>
|
<string name="use_auto_stub">使用自動存根</string>
|
||||||
<string name="use_auto_stub_description">自動補上缺少的服務和功能。可提高相容性但可能導致當機和穩定性問題。</string>
|
<string name="use_auto_stub_description">自動補上缺少的服務和功能,可提高相容性但可能導致當機和穩定性問題</string>
|
||||||
|
|
||||||
<string name="gpu">GPU</string>
|
<string name="gpu">GPU</string>
|
||||||
<string name="renderer_api">API</string>
|
<string name="renderer_api">API</string>
|
||||||
<string name="renderer_debug">圖形偵錯</string>
|
<string name="renderer_debug">圖形偵錯</string>
|
||||||
<string name="renderer_debug_description">將圖形API設為慢速偵錯模式</string>
|
<string name="renderer_debug_description">將圖形API設為慢速偵錯模式</string>
|
||||||
<string name="patch_old_qcom_drivers">BCn區塊壓縮紋理修補</string>
|
<string name="patch_old_qcom_drivers">BCn區塊壓縮紋理修補</string>
|
||||||
<string name="patch_old_qcom_drivers_description">覆寫 Adreno GPU 的 BCn 紋理格式自動偵測。通常會根據 Android 版本自動偵測(會在API 28 以上自動啟用)</string>
|
<string name="patch_old_qcom_drivers_description">覆寫Adreno GPU的BCn紋理格式自動偵測。通常會根據Android版本自動偵測(會在API 28以上的裝置自動啟用)</string>
|
||||||
<string name="fastmem">Fastmem</string>
|
<string name="fastmem">Fastmem</string>
|
||||||
|
|
||||||
<string name="log">日誌</string>
|
<string name="log">日誌</string>
|
||||||
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
<string name="flush_by_line">按行寫入偵錯日誌</string>
|
||||||
<string name="flush_by_line_description">在每行寫入時重新整理偵錯日誌,讓程式在當機或閃退時更容易偵錯。</string>
|
<string name="flush_by_line_description">在寫入一行日誌就立刻更新偵錯記錄,讓程式在當機或閃退時更容易偵錯</string>
|
||||||
<string name="extended_logging">啟用更詳細的日誌記錄</string>
|
<string name="extended_logging">啟用更詳細的日誌記錄</string>
|
||||||
<string name="extended_logging_description">將日誌檔的最大檔案限制從100MB提高到1GB</string>
|
<string name="extended_logging_description">將日誌檔的最大檔案限制從100MB提高到1GB</string>
|
||||||
<string name="log_filter">日誌過濾器</string>
|
<string name="log_filter">日誌過濾器</string>
|
||||||
@@ -641,11 +648,11 @@
|
|||||||
<string name="gpu_log_vulkan_calls">記錄Vulkan API呼叫</string>
|
<string name="gpu_log_vulkan_calls">記錄Vulkan API呼叫</string>
|
||||||
<string name="gpu_log_vulkan_calls_description">在環形緩衝區中記錄所有Vulkan API呼叫</string>
|
<string name="gpu_log_vulkan_calls_description">在環形緩衝區中記錄所有Vulkan API呼叫</string>
|
||||||
<string name="gpu_log_shader_dumps">傾印SPIR-V著色器</string>
|
<string name="gpu_log_shader_dumps">傾印SPIR-V著色器</string>
|
||||||
<string name="gpu_log_shader_dumps_description">將重新編譯後的 SPIR-V 二進位檔案 (.spv) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查</string>
|
<string name="gpu_log_shader_dumps_description">將重新編譯後的SPIR-V二進位檔案(.spv)儲存至Eden資料夾裡的dump資料夾中。可使用 spirv-dis/spirv-cross/spirv-val 進行檢查</string>
|
||||||
<string name="dump_guest_shaders">傾印客體(Maxwell)著色器</string>
|
<string name="dump_guest_shaders">傾印客體(Maxwell)著色器</string>
|
||||||
<string name="dump_guest_shaders_description">將 Maxwell 客體著色器位元組碼檔案 (.ash) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 nvdisasm 進行檢查</string>
|
<string name="dump_guest_shaders_description">將Maxwell客體著色器位元組碼檔案(.ash)儲存至Eden資料夾裡的dump資料夾中。可使用 nvdisasm 進行檢查</string>
|
||||||
<string name="dump_macros">傾印Maxwell巨集</string>
|
<string name="dump_macros">傾印Maxwell巨集</string>
|
||||||
<string name="dump_macros_description">將 Maxwell 巨集程式檔案 (.macro) 儲存至 Eden 資料夾裡的 dump 資料夾中。可使用 envydis 進行檢查</string>
|
<string name="dump_macros_description">將Maxwell巨集程式檔案(.macro)儲存至Eden資料夾裡的dump資料夾中。可使用 envydis 進行檢查</string>
|
||||||
<string name="gpu_log_memory_tracking">追蹤GPU記憶體</string>
|
<string name="gpu_log_memory_tracking">追蹤GPU記憶體</string>
|
||||||
<string name="gpu_log_memory_tracking_description">監控GPU記憶體的分配和釋放</string>
|
<string name="gpu_log_memory_tracking_description">監控GPU記憶體的分配和釋放</string>
|
||||||
<string name="gpu_log_driver_debug">驅動程式偵錯資料</string>
|
<string name="gpu_log_driver_debug">驅動程式偵錯資料</string>
|
||||||
@@ -799,7 +806,7 @@
|
|||||||
<string name="recommended_driver">推薦驅動程式:</string>
|
<string name="recommended_driver">推薦驅動程式:</string>
|
||||||
<string name="gpu_model">GPU型號</string>
|
<string name="gpu_model">GPU型號</string>
|
||||||
<string name="unsupported_gpu">不支援的GPU</string>
|
<string name="unsupported_gpu">不支援的GPU</string>
|
||||||
<string name="unsupported_gpu_warning">您的GPU不支援驅動程式注入。不建議嘗試設定自訂驅動程式。</string>
|
<string name="unsupported_gpu_warning">您的GPU不支援驅動程式注入,不建議嘗試設定自訂驅動程式</string>
|
||||||
|
|
||||||
<!-- Preferences Screen -->
|
<!-- Preferences Screen -->
|
||||||
<string name="preferences_settings">設定</string>
|
<string name="preferences_settings">設定</string>
|
||||||
|
|||||||
@@ -580,8 +580,6 @@
|
|||||||
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
<string name="renderer_force_max_clock_description">Forces the GPU to run at the maximum possible clocks (thermal constraints will still be applied).</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
<string name="renderer_asynchronous_gpu_emulation">GPU async emulation</string>
|
||||||
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
<string name="renderer_asynchronous_gpu_emulation_description">This hack can increase performance by running GPU emulation asynchronously at the cost of graphical issues and increased crash rates by timing-related operations.</string>
|
||||||
<string name="renderer_async_presentation">Asynchronous presentation</string>
|
|
||||||
<string name="renderer_async_presentation_description">This hack can increase performance by moving presentation to a separate CPU thread at the cost of graphical issues.</string>
|
|
||||||
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
<string name="renderer_reactive_flushing">Use reactive flushing</string>
|
||||||
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
<string name="renderer_reactive_flushing_description">Improves rendering accuracy in some games at the cost of performance.</string>
|
||||||
<string name="enable_buffer_history">Enable buffer history</string>
|
<string name="enable_buffer_history">Enable buffer history</string>
|
||||||
@@ -595,6 +593,8 @@
|
|||||||
<string name="fast_gpu_time_description">Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks.</string>
|
<string name="fast_gpu_time_description">Makes the game believe GPU work finishes faster than it does, so it stops lowering resolution and render distance to fit the Switch\'s clocks.</string>
|
||||||
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
<string name="skip_cpu_inner_invalidation">Skip CPU Inner Invalidation</string>
|
||||||
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
<string name="skip_cpu_inner_invalidation_description">Skips certain CPU-side cache invalidations during memory updates, reducing CPU usage and improving it\'s performance. This may cause glitches or crashes on some games.</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback">GPU Readback Before NCE Invalidation</string>
|
||||||
|
<string name="nce_invalidation_gpu_readback_description">Temporary. Fix Ender Magnolia (and other UE titles) crashes. May reduce performance. Improvement in progress.</string>
|
||||||
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
<string name="fix_bloom_effects">Fix Bloom Effects</string>
|
||||||
<string name="fix_bloom_effects_description">Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games.</string>
|
<string name="fix_bloom_effects_description">Reduces bloom blur in LA/EOW (Adreno A6XX - A7XX/ Turnip), removes bloom in Burnout. Warning: may cause graphical artifacts in other games.</string>
|
||||||
<string name="emulate_bgr565">Emulate BGR565</string>
|
<string name="emulate_bgr565">Emulate BGR565</string>
|
||||||
|
|||||||
+14
-15
@@ -171,8 +171,13 @@ struct Values {
|
|||||||
SwitchableSetting<bool> enable_overlay{linkage, false, "enable_overlay", Category::LibraryApplet};
|
SwitchableSetting<bool> enable_overlay{linkage, false, "enable_overlay", Category::LibraryApplet};
|
||||||
|
|
||||||
// Audio
|
// Audio
|
||||||
SwitchableSetting<AudioEngine> sink_id{linkage, AudioEngine::Auto, "output_engine",
|
SwitchableSetting<AudioEngine> sink_id{linkage,
|
||||||
Category::Audio, Specialization::RuntimeList};
|
#ifdef __ANDROID__
|
||||||
|
AudioEngine::Sdl3,
|
||||||
|
#else
|
||||||
|
AudioEngine::Auto,
|
||||||
|
#endif
|
||||||
|
"output_engine", Category::Audio, Specialization::RuntimeList};
|
||||||
SwitchableSetting<std::string> audio_output_device_id{
|
SwitchableSetting<std::string> audio_output_device_id{
|
||||||
linkage, "auto", "output_device", Category::Audio, Specialization::RuntimeList};
|
linkage, "auto", "output_device", Category::Audio, Specialization::RuntimeList};
|
||||||
SwitchableSetting<std::string> audio_input_device_id{
|
SwitchableSetting<std::string> audio_input_device_id{
|
||||||
@@ -472,13 +477,8 @@ struct Values {
|
|||||||
SwitchableSetting<bool> frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow",
|
SwitchableSetting<bool> frame_gen_dump_flow{linkage, false, "frame_gen_dump_flow",
|
||||||
Category::Renderer};
|
Category::Renderer};
|
||||||
|
|
||||||
SwitchableSetting<bool> use_asynchronous_gpu_emulation{linkage,
|
SwitchableSetting<bool> use_asynchronous_gpu_emulation{linkage, true, "use_asynchronous_gpu_emulation",
|
||||||
#ifdef __ANDROID__
|
Category::Renderer};
|
||||||
false,
|
|
||||||
#else
|
|
||||||
true,
|
|
||||||
#endif
|
|
||||||
"use_asynchronous_gpu_emulation", Category::Renderer};
|
|
||||||
// *nix platforms may have issues with the borderless windowed fullscreen mode.
|
// *nix platforms may have issues with the borderless windowed fullscreen mode.
|
||||||
// Default to exclusive fullscreen on these platforms for now.
|
// Default to exclusive fullscreen on these platforms for now.
|
||||||
SwitchableSetting<FullscreenMode, true> fullscreen_mode{linkage,
|
SwitchableSetting<FullscreenMode, true> fullscreen_mode{linkage,
|
||||||
@@ -537,7 +537,7 @@ struct Values {
|
|||||||
"vram_usage_mode",
|
"vram_usage_mode",
|
||||||
Category::RendererAdvanced};
|
Category::RendererAdvanced};
|
||||||
|
|
||||||
SwitchableSetting<NvdecEmulation> nvdec_emulation{linkage, NvdecEmulation::Gpu,
|
SwitchableSetting<NvdecEmulation> nvdec_emulation{linkage, NvdecEmulation::Cpu,
|
||||||
"nvdec_emulation", Category::RendererAdvanced};
|
"nvdec_emulation", Category::RendererAdvanced};
|
||||||
|
|
||||||
SwitchableSetting<AnisotropyMode, true> max_anisotropy{linkage,
|
SwitchableSetting<AnisotropyMode, true> max_anisotropy{linkage,
|
||||||
@@ -639,9 +639,11 @@ struct Values {
|
|||||||
Specialization::Default,
|
Specialization::Default,
|
||||||
true,
|
true,
|
||||||
true};
|
true};
|
||||||
|
SwitchableSetting<bool> nce_invalidation_gpu_readback{
|
||||||
|
linkage, false, "nce_invalidation_gpu_readback", Category::RendererHacks};
|
||||||
SwitchableSetting<bool> async_presentation{linkage,
|
SwitchableSetting<bool> async_presentation{linkage,
|
||||||
#ifdef __ANDROID__
|
#ifdef __ANDROID__
|
||||||
false,
|
true,
|
||||||
#else
|
#else
|
||||||
false,
|
false,
|
||||||
#endif
|
#endif
|
||||||
@@ -653,9 +655,6 @@ struct Values {
|
|||||||
SwitchableSetting<bool> emulate_bgr565{linkage, false, "emulate_bgr565",
|
SwitchableSetting<bool> emulate_bgr565{linkage, false, "emulate_bgr565",
|
||||||
Category::RendererHacks};
|
Category::RendererHacks};
|
||||||
|
|
||||||
SwitchableSetting<bool> rescale_hack{linkage, false, "rescale_hack",
|
|
||||||
Category::RendererHacks};
|
|
||||||
|
|
||||||
SwitchableSetting<bool> use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
|
SwitchableSetting<bool> use_asynchronous_shaders{linkage, false, "use_asynchronous_shaders",
|
||||||
Category::RendererHacks};
|
Category::RendererHacks};
|
||||||
|
|
||||||
@@ -932,7 +931,7 @@ struct Values {
|
|||||||
// Network
|
// Network
|
||||||
Setting<std::string> network_interface{linkage, std::string(), "network_interface",
|
Setting<std::string> network_interface{linkage, std::string(), "network_interface",
|
||||||
Category::Network};
|
Category::Network};
|
||||||
SwitchableSetting<bool> airplane_mode{linkage, false, "airplane_mode", Category::Network};
|
SwitchableSetting<bool> airplane_mode{linkage, true, "airplane_mode", Category::Network};
|
||||||
|
|
||||||
// WebService
|
// WebService
|
||||||
Setting<std::string> web_api_url{linkage, "api.ynet-fun.xyz", "web_api_url",
|
Setting<std::string> web_api_url{linkage, "api.ynet-fun.xyz", "web_api_url",
|
||||||
|
|||||||
@@ -150,7 +150,7 @@ ENUM(ScalingFilter, NearestNeighbor, Bilinear, Bicubic, Gaussian, Lanczos, Scale
|
|||||||
ENUM(AntiAliasing, None, Fxaa, Smaa);
|
ENUM(AntiAliasing, None, Fxaa, Smaa);
|
||||||
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
ENUM(AspectRatio, R16_9, R4_3, R21_9, R16_10, Stretch);
|
||||||
ENUM(ConsoleMode, Handheld, Docked);
|
ENUM(ConsoleMode, Handheld, Docked);
|
||||||
ENUM(AppletMode, HLE, LLE);
|
ENUM(AppletMode, HLE, LLE, Disabled);
|
||||||
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
ENUM(SpirvOptimizeMode, Never, OnLoad, Always);
|
||||||
ENUM(GpuClock, Normal, Boost, Overclock)
|
ENUM(GpuClock, Normal, Boost, Overclock)
|
||||||
ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge)
|
ENUM(GpuUnswizzleSize, VerySmall, Small, Normal, Large, VeryLarge)
|
||||||
|
|||||||
@@ -45,6 +45,24 @@ Patcher::Patcher() : c(m_patch_instructions), c_pre(m_patch_instructions_pre) {
|
|||||||
WriteLoadContext(c_pre);
|
WriteLoadContext(c_pre);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Patcher::Patcher(std::span<const u8> text) : c(m_patch_instructions), c_pre(m_patch_instructions_pre) {
|
||||||
|
modules.emplace_back();
|
||||||
|
curr_patch = &modules.back();
|
||||||
|
const auto words = std::span<const u32>{reinterpret_cast<const u32*>(text.data()), text.size() / sizeof(u32)};
|
||||||
|
for (u32 i = ModuleCodeIndex; i < static_cast<u32>(words.size()); ++i) {
|
||||||
|
const uintptr_t offset = i * sizeof(u32);
|
||||||
|
if (auto mrs = MRS{words[i]};
|
||||||
|
mrs.Verify() && mrs.GetRt() != 31 && (mrs.GetSystemReg() == TpidrEl0 || mrs.GetSystemReg() == TpidrroEl0)) {
|
||||||
|
BranchToPatch(offset);
|
||||||
|
const auto src_reg = mrs.GetSystemReg() == TpidrroEl0 ? oaknut::SystemReg::TPIDRRO_EL0 : oaknut::SystemReg::TPIDR_EL0;
|
||||||
|
WriteMrsHandler(offset + sizeof(u32), oaknut::XReg{static_cast<int>(mrs.GetRt())}, src_reg);
|
||||||
|
} else if (auto msr = MSR{words[i]}; msr.Verify() && msr.GetSystemReg() == TpidrEl0) {
|
||||||
|
BranchToPatch(offset);
|
||||||
|
WriteMsrHandler(offset + sizeof(u32), oaknut::XReg{static_cast<int>(msr.GetRt())});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
Patcher::~Patcher() = default;
|
Patcher::~Patcher() = default;
|
||||||
|
|
||||||
bool Patcher::PatchText(std::span<const u8> program_image, const Kernel::CodeSet::Segment& code) {
|
bool Patcher::PatchText(std::span<const u8> program_image, const Kernel::CodeSet::Segment& code) {
|
||||||
@@ -182,6 +200,31 @@ bool Patcher::PatchText(std::span<const u8> program_image, const Kernel::CodeSet
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
std::span<const u32> Patcher::RelocateRuntimeTls(
|
||||||
|
s64 patch_offset, std::vector<InstructionPatch>& out_patches) {
|
||||||
|
const auto& patch = modules.front();
|
||||||
|
const auto can_branch = [](s64 offset) {
|
||||||
|
return offset % 4 == 0 && offset >= -static_cast<s64>(MaxRelativeBranch) && offset < static_cast<s64>(MaxRelativeBranch);
|
||||||
|
};
|
||||||
|
out_patches.clear();
|
||||||
|
out_patches.reserve(patch.m_branch_to_patch_relocations.size());
|
||||||
|
for (const auto& rel : patch.m_branch_to_patch_relocations) {
|
||||||
|
const s64 offset = patch_offset + rel.patch_offset - static_cast<s64>(rel.module_offset);
|
||||||
|
if (!can_branch(offset)) {return {};}
|
||||||
|
u32 replacement;
|
||||||
|
oaknut::CodeGenerator rc{&replacement};
|
||||||
|
rc.B(offset);
|
||||||
|
out_patches.push_back({rel.module_offset, replacement});
|
||||||
|
}
|
||||||
|
for (const auto& rel : patch.m_branch_to_module_relocations) {
|
||||||
|
const s64 offset = static_cast<s64>(rel.module_offset) - patch_offset - rel.patch_offset;
|
||||||
|
if (!can_branch(offset)) {return {};}
|
||||||
|
oaknut::CodeGenerator rc{m_patch_instructions.data() + rel.patch_offset / sizeof(u32)};
|
||||||
|
rc.B(offset);
|
||||||
|
}
|
||||||
|
return m_patch_instructions;
|
||||||
|
}
|
||||||
|
|
||||||
bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector<u8>& program_image, EntryTrampolines* out_trampolines) {
|
bool Patcher::RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector<u8>& program_image, EntryTrampolines* out_trampolines) {
|
||||||
const size_t patch_size = GetSectionSize();
|
const size_t patch_size = GetSectionSize();
|
||||||
const size_t pre_patch_size = GetPreSectionSize();
|
const size_t pre_patch_size = GetPreSectionSize();
|
||||||
|
|||||||
@@ -48,15 +48,22 @@ using ModuleTextAddress = u64;
|
|||||||
using PatchTextAddress = u64;
|
using PatchTextAddress = u64;
|
||||||
using EntryTrampolines = ::Common::unordered_map<ModuleTextAddress, PatchTextAddress>;
|
using EntryTrampolines = ::Common::unordered_map<ModuleTextAddress, PatchTextAddress>;
|
||||||
|
|
||||||
|
struct InstructionPatch {
|
||||||
|
u64 offset;
|
||||||
|
u32 replacement;
|
||||||
|
};
|
||||||
|
|
||||||
class Patcher {
|
class Patcher {
|
||||||
public:
|
public:
|
||||||
void SetModuleID(const ModuleID& id) {
|
void SetModuleID(const ModuleID& id) {
|
||||||
module_id = id;
|
module_id = id;
|
||||||
}
|
}
|
||||||
explicit Patcher();
|
explicit Patcher();
|
||||||
|
explicit Patcher(std::span<const u8> text);
|
||||||
~Patcher();
|
~Patcher();
|
||||||
bool PatchText(std::span<const u8> program_image, const Kernel::CodeSet::Segment& code);
|
bool PatchText(std::span<const u8> program_image, const Kernel::CodeSet::Segment& code);
|
||||||
bool RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector<u8>& program_image, EntryTrampolines* out_trampolines);
|
bool RelocateAndCopy(Common::ProcessAddress load_base, const Kernel::CodeSet::Segment& code, std::vector<u8>& program_image, EntryTrampolines* out_trampolines);
|
||||||
|
std::span<const u32> RelocateRuntimeTls(s64 patch_offset, std::vector<InstructionPatch>& out_patches);
|
||||||
size_t GetSectionSize() const noexcept;
|
size_t GetSectionSize() const noexcept;
|
||||||
size_t GetPreSectionSize() const noexcept;
|
size_t GetPreSectionSize() const noexcept;
|
||||||
|
|
||||||
|
|||||||
@@ -250,9 +250,10 @@ std::shared_ptr<FrontendApplet> FrontendAppletHolder::GetApplet(std::shared_ptr<
|
|||||||
return std::make_shared<PhotoViewer>(system, applet, mode, *frontend.photo_viewer);
|
return std::make_shared<PhotoViewer>(system, applet, mode, *frontend.photo_viewer);
|
||||||
case AppletId::NetConnect:
|
case AppletId::NetConnect:
|
||||||
return std::make_shared<NetConnect>(system, applet, mode, *frontend.net_connect);
|
return std::make_shared<NetConnect>(system, applet, mode, *frontend.net_connect);
|
||||||
|
case AppletId::None:
|
||||||
|
return nullptr;
|
||||||
default:
|
default:
|
||||||
LOG_ERROR(Service_AM, "No backend implementation exists for applet_id={:02X} program_id={:016X}"
|
UNIMPLEMENTED_MSG("No frontend implementation exists for applet_id={:02X} program_id={:016X}! Using stub applet.", static_cast<u8>(id), applet->program_id);
|
||||||
"Falling back to stub applet", static_cast<u8>(id), applet->program_id);
|
|
||||||
return std::make_shared<StubApplet>(system, applet, id, mode);
|
return std::make_shared<StubApplet>(system, applet, id, mode);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -6,12 +6,11 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
#include <functional>
|
|
||||||
#include <optional>
|
#include <optional>
|
||||||
#include <string>
|
#include <string>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
#include "core/file_sys/vfs/vfs_types.h"
|
|
||||||
#include "core/hle/result.h"
|
#include "core/hle/result.h"
|
||||||
#include "core/hle/service/bcat/bcat_types.h"
|
#include "core/hle/service/bcat/bcat_types.h"
|
||||||
#include "core/hle/service/kernel_helpers.h"
|
#include "core/hle/service/kernel_helpers.h"
|
||||||
|
|||||||
@@ -7,6 +7,7 @@
|
|||||||
#include <openssl/err.h>
|
#include <openssl/err.h>
|
||||||
#include <openssl/evp.h>
|
#include <openssl/evp.h>
|
||||||
|
|
||||||
|
#include "common/scope_exit.h"
|
||||||
#include "core/hle/kernel/k_process.h"
|
#include "core/hle/kernel/k_process.h"
|
||||||
|
|
||||||
#include "core/hle/service/cmif_serialization.h"
|
#include "core/hle/service/cmif_serialization.h"
|
||||||
@@ -16,6 +17,10 @@
|
|||||||
#include "core/hle/service/ro/ro_types.h"
|
#include "core/hle/service/ro/ro_types.h"
|
||||||
#include "core/hle/service/server_manager.h"
|
#include "core/hle/service/server_manager.h"
|
||||||
#include "core/hle/service/service.h"
|
#include "core/hle/service/service.h"
|
||||||
|
#ifdef HAS_NCE
|
||||||
|
#include "core/arm/nce/patcher.h"
|
||||||
|
#include "core/hle/kernel/k_shared_memory.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
namespace Service::RO {
|
namespace Service::RO {
|
||||||
|
|
||||||
@@ -386,7 +391,7 @@ public:
|
|||||||
R_SUCCEED();
|
R_SUCCEED();
|
||||||
}
|
}
|
||||||
|
|
||||||
Result MapManualLoadModuleMemory(u64* out_address, size_t context_id, u64 nro_address,
|
Result MapManualLoadModuleMemory(Kernel::KernelCore& kernel, u64* out_address, size_t context_id, u64 nro_address,
|
||||||
u64 nro_size, u64 bss_address, u64 bss_size) {
|
u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
// Get context.
|
// Get context.
|
||||||
ProcessContext* context = this->GetContextById(context_id);
|
ProcessContext* context = this->GetContextById(context_id);
|
||||||
@@ -421,10 +426,48 @@ public:
|
|||||||
R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size),
|
R_TRY(context->ValidateNro(std::addressof(nro_info->module_id), std::addressof(rx_size),
|
||||||
std::addressof(ro_size), std::addressof(rw_size),
|
std::addressof(ro_size), std::addressof(rw_size),
|
||||||
nro_info->base_address, nro_size, bss_size));
|
nro_info->base_address, nro_size, bss_size));
|
||||||
|
R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size, rw_size + bss_size));
|
||||||
// Set NRO perms.
|
#ifdef HAS_NCE
|
||||||
R_TRY(SetNroPerms(context->GetProcess(), nro_info->base_address, rx_size, ro_size,
|
if (Settings::IsNceEnabled()) {
|
||||||
rw_size + bss_size));
|
auto* process = context->GetProcess();
|
||||||
|
auto& memory = process->GetMemory();
|
||||||
|
std::vector<u8> text(rx_size);
|
||||||
|
memory.ReadBlock(nro_info->base_address, text.data(), text.size());
|
||||||
|
Core::NCE::Patcher patch{text};
|
||||||
|
const size_t patch_size = patch.GetSectionSize();
|
||||||
|
if (patch_size != 0) {
|
||||||
|
constexpr auto permission = Kernel::Svc::MemoryPermission::ReadExecute;
|
||||||
|
auto* patch_memory = Kernel::KSharedMemory::Create(kernel);
|
||||||
|
SCOPE_EXIT { patch_memory->Close(kernel); };
|
||||||
|
R_TRY(patch_memory->Initialize(kernel, kernel.System().DeviceMemory(), process, permission, permission, patch_size));
|
||||||
|
Kernel::KSharedMemory::Register(kernel, patch_memory);
|
||||||
|
const std::array<s64, 2> offsets{static_cast<s64>(total_size + Kernel::PageSize),-static_cast<s64>(patch_size + Kernel::PageSize)};
|
||||||
|
std::vector<Core::NCE::InstructionPatch> tls_patches;
|
||||||
|
std::span<const u32> instructions;
|
||||||
|
u64 patch_address = 0;
|
||||||
|
for (const s64 offset : offsets) {
|
||||||
|
instructions = patch.RelocateRuntimeTls(offset, tls_patches);
|
||||||
|
if (instructions.empty()) {continue;}
|
||||||
|
const u64 address = static_cast<u64>(static_cast<s64>(nro_info->base_address) + offset);
|
||||||
|
if (R_FAILED(patch_memory->Map(*process, address, patch_size, permission))) {continue;}
|
||||||
|
patch_address = address;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
R_UNLESS(patch_address != 0, RO::ResultOutOfAddressSpace);
|
||||||
|
ON_RESULT_FAILURE {R_ASSERT(patch_memory->Unmap(*process, patch_address, patch_size));};
|
||||||
|
R_TRY(process->AddSharedMemory(kernel, patch_memory, patch_address, patch_size));
|
||||||
|
std::memcpy(patch_memory->GetPointer(), instructions.data(), instructions.size_bytes());
|
||||||
|
auto* ptr = reinterpret_cast<char*>(patch_address);
|
||||||
|
__builtin___clear_cache(ptr, ptr + instructions.size_bytes());
|
||||||
|
for (const auto& instruction : tls_patches) {
|
||||||
|
const u64 address = nro_info->base_address + instruction.offset;
|
||||||
|
memory.Write32(address, instruction.replacement);
|
||||||
|
ptr = reinterpret_cast<char*>(address);
|
||||||
|
__builtin___clear_cache(ptr, ptr + sizeof(u32));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
context->SetNroInfoInUse(nro_info, true);
|
context->SetNroInfoInUse(nro_info, true);
|
||||||
nro_info->code_size = rx_size + ro_size;
|
nro_info->code_size = rx_size + ro_size;
|
||||||
@@ -531,7 +574,7 @@ public:
|
|||||||
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
|
Result MapManualLoadModuleMemory(Out<u64> out_load_address, ClientProcessId client_pid,
|
||||||
u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
u64 nro_address, u64 nro_size, u64 bss_address, u64 bss_size) {
|
||||||
R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid));
|
R_TRY(m_ro->ValidateProcess(m_context_id, *client_pid));
|
||||||
R_RETURN(m_ro->MapManualLoadModuleMemory(out_load_address.Get(), m_context_id, nro_address,
|
R_RETURN(m_ro->MapManualLoadModuleMemory(system.Kernel(), out_load_address.Get(), m_context_id, nro_address,
|
||||||
nro_size, bss_address, bss_size));
|
nro_size, bss_address, bss_size));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
+1
-1
@@ -757,7 +757,7 @@ struct Memory::Impl {
|
|||||||
};
|
};
|
||||||
auto& gpu = system.GPU();
|
auto& gpu = system.GPU();
|
||||||
gpu_device_memory->ApplyOpOnPointer(
|
gpu_device_memory->ApplyOpOnPointer(
|
||||||
p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size); });
|
p, scratch_buffers[core], [&](DAddr address) { gpu.InvalidateRegion(address, size, true); });
|
||||||
}
|
}
|
||||||
|
|
||||||
Core::System& system;
|
Core::System& system;
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2025 Eden Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-3.0-or-later
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
@@ -6,6 +6,8 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "common/bit_field.h"
|
#include "common/bit_field.h"
|
||||||
#include "common/common_funcs.h"
|
#include "common/common_funcs.h"
|
||||||
#include "common/common_types.h"
|
#include "common/common_types.h"
|
||||||
|
|||||||
@@ -13,6 +13,8 @@
|
|||||||
|
|
||||||
#include <array>
|
#include <array>
|
||||||
#include <functional>
|
#include <functional>
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include <SDL3/SDL_hidapi.h>
|
#include <SDL3/SDL_hidapi.h>
|
||||||
|
|
||||||
#include "common/bit_field.h"
|
#include "common/bit_field.h"
|
||||||
|
|||||||
@@ -4,7 +4,7 @@
|
|||||||
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2022 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
#include "common/logging.h"
|
#include <vector>
|
||||||
#include "input_common/helpers/joycon_protocol/poller.h"
|
#include "input_common/helpers/joycon_protocol/poller.h"
|
||||||
|
|
||||||
namespace InputCommon::Joycon {
|
namespace InputCommon::Joycon {
|
||||||
|
|||||||
@@ -194,6 +194,10 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||||||
INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"),
|
INSERT(Settings, skip_cpu_inner_invalidation, tr("Skip CPU Inner Invalidation"),
|
||||||
tr("Skips certain cache invalidations during memory updates, reducing CPU usage and "
|
tr("Skips certain cache invalidations during memory updates, reducing CPU usage and "
|
||||||
"improving latency. This may cause soft-crashes."));
|
"improving latency. This may cause soft-crashes."));
|
||||||
|
INSERT(Settings, nce_invalidation_gpu_readback,
|
||||||
|
tr("GPU Readback Before NCE Invalidation"),
|
||||||
|
tr("Flushes GPU buffer data back to guest memory before NCE invalidates the whole "
|
||||||
|
"guest page, preserving it while the CPU store proceeds."));
|
||||||
INSERT(Settings, vsync_mode, tr("VSync Mode:"),
|
INSERT(Settings, vsync_mode, tr("VSync Mode:"),
|
||||||
tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen "
|
tr("FIFO (VSync) does not drop frames or exhibit tearing but is limited by the screen "
|
||||||
"refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n"
|
"refresh rate.\nFIFO Relaxed allows tearing as it recovers from a slow down.\n"
|
||||||
@@ -271,12 +275,6 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||||||
"quality and performance consistency in some games."));
|
"quality and performance consistency in some games."));
|
||||||
INSERT(Settings, fix_bloom_effects, tr("Fix bloom effects"), tr("Removes bloom in Burnout."));
|
INSERT(Settings, fix_bloom_effects, tr("Fix bloom effects"), tr("Removes bloom in Burnout."));
|
||||||
|
|
||||||
INSERT(Settings, rescale_hack, tr("Enable Legacy Rescale Pass"),
|
|
||||||
tr("May fix rescale issues in some games by relying on behavior from the previous "
|
|
||||||
"implementation.\n"
|
|
||||||
"Legacy behavior workaround that fixes line artifacts on AMD and Intel GPUs, and "
|
|
||||||
"grey texture flicker on Nvidia GPUs in Luigis Mansion 3."));
|
|
||||||
|
|
||||||
// Renderer (Extensions)
|
// Renderer (Extensions)
|
||||||
INSERT(Settings, dyna_state, tr("Extended Dynamic State"),
|
INSERT(Settings, dyna_state, tr("Extended Dynamic State"),
|
||||||
tr("Controls the number of features that can be used in Extended Dynamic State.\n"
|
tr("Controls the number of features that can be used in Extended Dynamic State.\n"
|
||||||
@@ -342,9 +340,6 @@ std::unique_ptr<TranslationMap> InitializeTranslations(QObject* parent) {
|
|||||||
"it bypasses such prompts and directly exits the emulation."));
|
"it bypasses such prompts and directly exits the emulation."));
|
||||||
INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"),
|
INSERT(UISettings, hide_mouse, tr("Hide mouse on inactivity"),
|
||||||
tr("Hides the mouse after 2.5s of inactivity."));
|
tr("Hides the mouse after 2.5s of inactivity."));
|
||||||
INSERT(UISettings, controller_applet_disabled, tr("Disable controller applet"),
|
|
||||||
tr("Forcibly disables the use of the controller applet in emulated programs.\n"
|
|
||||||
"When a program attempts to open the controller applet, it is immediately closed."));
|
|
||||||
INSERT(UISettings, check_for_updates, tr("Check for updates"),
|
INSERT(UISettings, check_for_updates, tr("Check for updates"),
|
||||||
tr("Whether or not to check for updates upon startup."));
|
tr("Whether or not to check for updates upon startup."));
|
||||||
|
|
||||||
@@ -380,6 +375,7 @@ std::unique_ptr<ComboboxTranslationMap> ComboboxEnumeration(QObject* parent) {
|
|||||||
{
|
{
|
||||||
PAIR(AppletMode, HLE, tr("Custom frontend")),
|
PAIR(AppletMode, HLE, tr("Custom frontend")),
|
||||||
PAIR(AppletMode, LLE, tr("Real applet")),
|
PAIR(AppletMode, LLE, tr("Real applet")),
|
||||||
|
PAIR(AppletMode, Disabled, tr("Disabled")),
|
||||||
}});
|
}});
|
||||||
|
|
||||||
translations->insert({Settings::EnumMetadata<Settings::SpirvOptimizeMode>::Index(),
|
translations->insert({Settings::EnumMetadata<Settings::SpirvOptimizeMode>::Index(),
|
||||||
|
|||||||
@@ -127,8 +127,6 @@ struct Values {
|
|||||||
Setting<bool> hide_mouse{
|
Setting<bool> hide_mouse{
|
||||||
linkage, true, "hideInactiveMouse", Category::UiGeneral, Settings::Specialization::Default,
|
linkage, true, "hideInactiveMouse", Category::UiGeneral, Settings::Specialization::Default,
|
||||||
true, true};
|
true, true};
|
||||||
Setting<bool> controller_applet_disabled{linkage, false, "disableControllerApplet",
|
|
||||||
Category::UiGeneral};
|
|
||||||
// Set when Vulkan is known to crash the application
|
// Set when Vulkan is known to crash the application
|
||||||
bool has_broken_vulkan = false;
|
bool has_broken_vulkan = false;
|
||||||
|
|
||||||
|
|||||||
@@ -301,7 +301,7 @@ IR::Program TranslateProgram(ObjectPool<IR::Inst>& inst_pool, ObjectPool<IR::Blo
|
|||||||
Optimization::GlobalMemoryToStorageBufferPass(program, normalized_host_info);
|
Optimization::GlobalMemoryToStorageBufferPass(program, normalized_host_info);
|
||||||
Optimization::TexturePass(env, program, normalized_host_info);
|
Optimization::TexturePass(env, program, normalized_host_info);
|
||||||
|
|
||||||
if (Settings::values.resolution_info.active || Settings::values.rescale_hack.GetValue()) {
|
if (Settings::values.resolution_info.active) {
|
||||||
Optimization::RescalingPass(program);
|
Optimization::RescalingPass(program);
|
||||||
}
|
}
|
||||||
Optimization::DeadCodeEliminationPass(program);
|
Optimization::DeadCodeEliminationPass(program);
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -28,6 +31,7 @@ void TexturePass(Environment& env, IR::Program& program, const HostTranslateInfo
|
|||||||
void LayerPass(IR::Program& program, const HostTranslateInfo& host_info);
|
void LayerPass(IR::Program& program, const HostTranslateInfo& host_info);
|
||||||
void VendorWorkaroundPass(IR::Program& program);
|
void VendorWorkaroundPass(IR::Program& program);
|
||||||
void VerificationPass(const IR::Program& program);
|
void VerificationPass(const IR::Program& program);
|
||||||
|
bool HasBrokenPattern(const IR::Program& program);
|
||||||
|
|
||||||
// Dual Vertex
|
// Dual Vertex
|
||||||
void VertexATransformPass(IR::Program& program);
|
void VertexATransformPass(IR::Program& program);
|
||||||
|
|||||||
@@ -67,19 +67,12 @@ void VisitMark(IR::Block& block, IR::Inst& inst) {
|
|||||||
if (must_patch_outside) {
|
if (must_patch_outside) {
|
||||||
const auto it{IR::Block::InstructionList::s_iterator_to(inst)};
|
const auto it{IR::Block::InstructionList::s_iterator_to(inst)};
|
||||||
IR::IREmitter ir{block, it};
|
IR::IREmitter ir{block, it};
|
||||||
if (Settings::values.rescale_hack.GetValue()) {
|
|
||||||
const IR::F32 new_inst{&*block.PrependNewInst(it, inst)};
|
|
||||||
const IR::F32 up_factor{ir.FPRecip(ir.ResolutionDownFactor())};
|
|
||||||
const IR::Value converted{ir.FPMul(new_inst, up_factor)};
|
|
||||||
inst.ReplaceUsesWith(converted);
|
|
||||||
} else {
|
|
||||||
IR::Inst* const new_inst{&*block.PrependNewInst(it, inst)};
|
IR::Inst* const new_inst{&*block.PrependNewInst(it, inst)};
|
||||||
const IR::F32 new_bitcast{ir.ConvertUToF(32, 32, IR::Value{new_inst})};
|
const IR::F32 new_bitcast{ir.ConvertUToF(32, 32, IR::Value{new_inst})};
|
||||||
const IR::F32 up_factor{ir.FPRecip(ir.ResolutionDownFactor())};
|
const IR::F32 up_factor{ir.FPRecip(ir.ResolutionDownFactor())};
|
||||||
const IR::Value converted{ir.FPMul(new_bitcast, up_factor)};
|
const IR::Value converted{ir.FPMul(new_bitcast, up_factor)};
|
||||||
inst.ReplaceUsesWith(converted);
|
inst.ReplaceUsesWith(converted);
|
||||||
}
|
}
|
||||||
}
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
// SPDX-FileCopyrightText: Copyright 2023 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -76,4 +79,44 @@ void VendorWorkaroundPass(IR::Program& program) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
bool HasBrokenPattern(const IR::Program& program) {
|
||||||
|
if (program.stage != Stage::Fragment) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
for (const IR::Block* block : program.post_order_blocks) {
|
||||||
|
for (const IR::Inst& inst : block->Instructions()) {
|
||||||
|
switch (inst.GetOpcode()) {
|
||||||
|
case IR::Opcode::ShuffleIndex:
|
||||||
|
case IR::Opcode::ShuffleUp:
|
||||||
|
case IR::Opcode::ShuffleDown:
|
||||||
|
case IR::Opcode::ShuffleButterfly:
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const IR::Value shuffle_arg{inst.Arg(0)};
|
||||||
|
if (shuffle_arg.IsImmediate()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const IR::Inst* bitcast{shuffle_arg.InstRecursive()};
|
||||||
|
if (!bitcast || bitcast->GetOpcode() != IR::Opcode::BitCastU32F32) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const IR::Value bitcast_arg{bitcast->Arg(0)};
|
||||||
|
if (bitcast_arg.IsImmediate()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const IR::Inst* attribute{bitcast_arg.InstRecursive()};
|
||||||
|
if (!attribute || attribute->GetOpcode() != IR::Opcode::GetAttribute) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const IR::Attribute attr{attribute->Arg(0).Attribute()};
|
||||||
|
if (attr == IR::Attribute::PositionX || attr == IR::Attribute::PositionY) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
} // namespace Shader::Optimization
|
} // namespace Shader::Optimization
|
||||||
|
|||||||
+15
-3
@@ -226,7 +226,19 @@ struct GPU::Impl {
|
|||||||
}
|
}
|
||||||
|
|
||||||
/// Notify rasterizer that any caches of the specified region should be invalidated
|
/// Notify rasterizer that any caches of the specified region should be invalidated
|
||||||
void InvalidateRegion(DAddr addr, u64 size) {
|
void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) {
|
||||||
|
if (Settings::values.nce_invalidation_gpu_readback.GetValue()) {
|
||||||
|
VideoCore::RasterizerInterface* rasterizer = renderer->ReadRasterizer();
|
||||||
|
if (preserve_gpu_writes && rasterizer->MustFlushRegion(addr, size, VideoCommon::CacheType::BufferCache)) {
|
||||||
|
const u64 fence = RequestSyncOperation([rasterizer, addr, size] {
|
||||||
|
rasterizer->FlushRegion(addr, size, VideoCommon::CacheType::BufferCache);
|
||||||
|
rasterizer->OnCacheInvalidation(addr, size);
|
||||||
|
});
|
||||||
|
gpu_thread.TickGPU(is_async);
|
||||||
|
WaitForSyncOperation(fence);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
}
|
||||||
gpu_thread.InvalidateRegion(addr, size);
|
gpu_thread.InvalidateRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -518,8 +530,8 @@ void GPU::FlushRegion(DAddr addr, u64 size) {
|
|||||||
impl->FlushRegion(addr, size);
|
impl->FlushRegion(addr, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
void GPU::InvalidateRegion(DAddr addr, u64 size) {
|
void GPU::InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes) {
|
||||||
impl->InvalidateRegion(addr, size);
|
impl->InvalidateRegion(addr, size, preserve_gpu_writes);
|
||||||
}
|
}
|
||||||
|
|
||||||
bool GPU::OnCPUWrite(DAddr addr, u64 size) {
|
bool GPU::OnCPUWrite(DAddr addr, u64 size) {
|
||||||
|
|||||||
@@ -248,7 +248,7 @@ public:
|
|||||||
void FlushRegion(DAddr addr, u64 size);
|
void FlushRegion(DAddr addr, u64 size);
|
||||||
|
|
||||||
/// Notify rasterizer that any caches of the specified region should be invalidated
|
/// Notify rasterizer that any caches of the specified region should be invalidated
|
||||||
void InvalidateRegion(DAddr addr, u64 size);
|
void InvalidateRegion(DAddr addr, u64 size, bool preserve_gpu_writes = false);
|
||||||
|
|
||||||
/// Notify rasterizer that CPU is trying to write this area. It returns true if the area is
|
/// Notify rasterizer that CPU is trying to write this area. It returns true if the area is
|
||||||
/// sensible, false otherwise, addr and size must be a valid combination
|
/// sensible, false otherwise, addr and size must be a valid combination
|
||||||
|
|||||||
@@ -217,13 +217,15 @@ void RendererVulkan::Composite(std::span<const Tegra::FramebufferConfig> framebu
|
|||||||
|
|
||||||
scheduler.RequestOutsideRenderPassOperationContext();
|
scheduler.RequestOutsideRenderPassOperationContext();
|
||||||
blit_swapchain.DrawToFrame(device, rasterizer, frame, framebuffers,
|
blit_swapchain.DrawToFrame(device, rasterizer, frame, framebuffers,
|
||||||
render_window.GetFramebufferLayout(), swapchain.GetImageCount(),
|
render_window.GetFramebufferLayout(),
|
||||||
|
present_manager.SwapchainImageCount(),
|
||||||
swapchain.GetImageViewFormat());
|
swapchain.GetImageViewFormat());
|
||||||
|
|
||||||
#ifdef HAS_LSFG
|
#ifdef HAS_LSFG
|
||||||
void(frame_gen.WantedGenerations(present_manager.MaxExtraFrames()));
|
void(frame_gen.WantedGenerations(present_manager.MaxExtraFrames()));
|
||||||
|
|
||||||
frame_gen.Process(device, frame, swapchain.GetImageFormat(), GuestExtent(framebuffers));
|
frame_gen.Process(device, frame, present_manager.SwapchainImageFormat(),
|
||||||
|
GuestExtent(framebuffers));
|
||||||
|
|
||||||
const size_t generated_frames = frame_gen.GeneratedFrameCount();
|
const size_t generated_frames = frame_gen.GeneratedFrameCount();
|
||||||
for (size_t generation = 0; generation < generated_frames; ++generation) {
|
for (size_t generation = 0; generation < generated_frames; ++generation) {
|
||||||
|
|||||||
@@ -23,6 +23,7 @@
|
|||||||
#include "shader_recompiler/environment.h"
|
#include "shader_recompiler/environment.h"
|
||||||
#include "shader_recompiler/frontend/maxwell/control_flow.h"
|
#include "shader_recompiler/frontend/maxwell/control_flow.h"
|
||||||
#include "shader_recompiler/frontend/maxwell/translate_program.h"
|
#include "shader_recompiler/frontend/maxwell/translate_program.h"
|
||||||
|
#include "shader_recompiler/ir_opt/passes.h"
|
||||||
#include "shader_recompiler/program_header.h"
|
#include "shader_recompiler/program_header.h"
|
||||||
#include "video_core/engines/kepler_compute.h"
|
#include "video_core/engines/kepler_compute.h"
|
||||||
#include "video_core/engines/maxwell_3d.h"
|
#include "video_core/engines/maxwell_3d.h"
|
||||||
@@ -826,6 +827,11 @@ std::unique_ptr<GraphicsPipeline> PipelineCache::CreateGraphicsPipeline(
|
|||||||
programs[index] = MergeDualVertexPrograms(program_va, program_vb, env);
|
programs[index] = MergeDualVertexPrograms(program_va, program_vb, env);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (device.GetDriverID() != VK_DRIVER_ID_NVIDIA_PROPRIETARY && Shader::Optimization::HasBrokenPattern(programs[index])) {
|
||||||
|
LOG_WARNING(Render_Vulkan, "0x{:016x}: Skipping shader with known issues", key.unique_hashes[index]);
|
||||||
|
return nullptr;
|
||||||
|
}
|
||||||
|
|
||||||
if (Settings::values.dump_guest_shaders) {
|
if (Settings::values.dump_guest_shaders) {
|
||||||
env.Dump(hash, key.unique_hashes[index]);
|
env.Dump(hash, key.unique_hashes[index]);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -23,6 +23,7 @@ namespace Vulkan {
|
|||||||
namespace {
|
namespace {
|
||||||
|
|
||||||
constexpr size_t MAX_FRAMES_IN_FLIGHT = 7;
|
constexpr size_t MAX_FRAMES_IN_FLIGHT = 7;
|
||||||
|
constexpr u32 MAX_PRESENT_ATTEMPTS = 3;
|
||||||
#ifdef HAS_LSFG
|
#ifdef HAS_LSFG
|
||||||
static_assert(MAX_FRAMES_IN_FLIGHT <= LSFG_MAX_TARGETS);
|
static_assert(MAX_FRAMES_IN_FLIGHT <= LSFG_MAX_TARGETS);
|
||||||
#endif
|
#endif
|
||||||
@@ -372,12 +373,33 @@ void PresentManager::SetImageCount() {
|
|||||||
#else
|
#else
|
||||||
image_count = std::min<size_t>(swapchain.GetImageCount(), MAX_FRAMES_IN_FLIGHT);
|
image_count = std::min<size_t>(swapchain.GetImageCount(), MAX_FRAMES_IN_FLIGHT);
|
||||||
#endif
|
#endif
|
||||||
|
swapchain_image_count = swapchain.GetImageCount();
|
||||||
|
swapchain_image_format = swapchain.GetImageFormat();
|
||||||
|
}
|
||||||
|
|
||||||
|
void PresentManager::DiscardFrame(Frame* frame) {
|
||||||
|
static constexpr VkPipelineStageFlags wait_stage = VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT;
|
||||||
|
const VkSemaphore render_ready = *frame->render_ready;
|
||||||
|
const VkSubmitInfo submit_info{
|
||||||
|
.sType = VK_STRUCTURE_TYPE_SUBMIT_INFO,
|
||||||
|
.pNext = nullptr,
|
||||||
|
.waitSemaphoreCount = 1U,
|
||||||
|
.pWaitSemaphores = &render_ready,
|
||||||
|
.pWaitDstStageMask = &wait_stage,
|
||||||
|
.commandBufferCount = 0U,
|
||||||
|
.pCommandBuffers = nullptr,
|
||||||
|
.signalSemaphoreCount = 0U,
|
||||||
|
.pSignalSemaphores = nullptr,
|
||||||
|
};
|
||||||
|
|
||||||
|
std::scoped_lock submit_lock{scheduler.submit_mutex};
|
||||||
|
void(device.GetGraphicsQueue().Submit(submit_info, *frame->present_done));
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresentManager::CopyToSwapchain(Frame* frame) {
|
void PresentManager::CopyToSwapchain(Frame* frame) {
|
||||||
bool requires_recreation = false;
|
bool requires_recreation = false;
|
||||||
|
|
||||||
while (true) {
|
for (u32 attempt = 0; attempt < MAX_PRESENT_ATTEMPTS; ++attempt) {
|
||||||
try {
|
try {
|
||||||
// Recreate surface and swapchain if needed.
|
// Recreate surface and swapchain if needed.
|
||||||
if (requires_recreation) {
|
if (requires_recreation) {
|
||||||
@@ -397,6 +419,8 @@ void PresentManager::CopyToSwapchain(Frame* frame) {
|
|||||||
requires_recreation = true;
|
requires_recreation = true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
DiscardFrame(frame);
|
||||||
}
|
}
|
||||||
|
|
||||||
void PresentManager::CopyToSwapchainImpl(Frame* frame) {
|
void PresentManager::CopyToSwapchainImpl(Frame* frame) {
|
||||||
|
|||||||
@@ -6,6 +6,7 @@
|
|||||||
|
|
||||||
#pragma once
|
#pragma once
|
||||||
|
|
||||||
|
#include <atomic>
|
||||||
#include <condition_variable>
|
#include <condition_variable>
|
||||||
#include <mutex>
|
#include <mutex>
|
||||||
#include <boost/container/deque.hpp>
|
#include <boost/container/deque.hpp>
|
||||||
@@ -68,6 +69,9 @@ public:
|
|||||||
/// How many additional frames can be queued without stalling the render thread
|
/// How many additional frames can be queued without stalling the render thread
|
||||||
[[nodiscard]] size_t MaxExtraFrames() const;
|
[[nodiscard]] size_t MaxExtraFrames() const;
|
||||||
|
|
||||||
|
[[nodiscard]] std::size_t SwapchainImageCount() const { return swapchain_image_count; }
|
||||||
|
[[nodiscard]] VkFormat SwapchainImageFormat() const { return swapchain_image_format; }
|
||||||
|
|
||||||
private:
|
private:
|
||||||
void PresentThread(std::stop_token token);
|
void PresentThread(std::stop_token token);
|
||||||
|
|
||||||
@@ -77,6 +81,8 @@ private:
|
|||||||
|
|
||||||
void RecreateSwapchain(Frame* frame);
|
void RecreateSwapchain(Frame* frame);
|
||||||
|
|
||||||
|
void DiscardFrame(Frame* frame);
|
||||||
|
|
||||||
void SetImageCount();
|
void SetImageCount();
|
||||||
|
|
||||||
private:
|
private:
|
||||||
@@ -100,7 +106,9 @@ private:
|
|||||||
bool blit_supported;
|
bool blit_supported;
|
||||||
bool storage_supported;
|
bool storage_supported;
|
||||||
bool use_present_thread;
|
bool use_present_thread;
|
||||||
std::size_t image_count{};
|
std::atomic<std::size_t> image_count{};
|
||||||
|
std::atomic<std::size_t> swapchain_image_count{};
|
||||||
|
std::atomic<VkFormat> swapchain_image_format{};
|
||||||
};
|
};
|
||||||
|
|
||||||
} // namespace Vulkan
|
} // namespace Vulkan
|
||||||
|
|||||||
@@ -1,3 +1,6 @@
|
|||||||
|
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
|
||||||
|
// SPDX-License-Identifier: GPL-3.0-or-later
|
||||||
|
|
||||||
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
// SPDX-FileCopyrightText: 2024 yuzu Emulator Project
|
||||||
// SPDX-License-Identifier: GPL-2.0-or-later
|
// SPDX-License-Identifier: GPL-2.0-or-later
|
||||||
|
|
||||||
@@ -8,7 +11,6 @@
|
|||||||
|
|
||||||
class QCheckBox;
|
class QCheckBox;
|
||||||
class QLineEdit;
|
class QLineEdit;
|
||||||
class QComboBox;
|
|
||||||
class QDateTimeEdit;
|
class QDateTimeEdit;
|
||||||
namespace Core {
|
namespace Core {
|
||||||
class System;
|
class System;
|
||||||
|
|||||||
@@ -140,7 +140,12 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
|
|||||||
if (combobox_enumerations.contains(type)) {
|
if (combobox_enumerations.contains(type)) {
|
||||||
enumeration = &combobox_enumerations.at(type);
|
enumeration = &combobox_enumerations.at(type);
|
||||||
for (const auto& [id, name] : *enumeration) {
|
for (const auto& [id, name] : *enumeration) {
|
||||||
combobox->addItem(name);
|
if (type == Settings::EnumMetadata<Settings::AppletMode>::Index() &&
|
||||||
|
id == static_cast<u32>(Settings::AppletMode::Disabled) &&
|
||||||
|
setting.Id() != Settings::values.controller_applet_mode.Id()) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
combobox->addItem(name, id);
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
return combobox;
|
return combobox;
|
||||||
@@ -158,9 +163,8 @@ QWidget* Widget::CreateCombobox(std::function<std::string()>& serializer,
|
|||||||
const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
|
const u32 setting_value = std::strtoul(setting.ToString().c_str(), nullptr, 0);
|
||||||
combobox->setCurrentIndex(find_index(setting_value));
|
combobox->setCurrentIndex(find_index(setting_value));
|
||||||
|
|
||||||
serializer = [this, enumeration]() {
|
serializer = [this]() {
|
||||||
int current = combobox->currentIndex();
|
return std::to_string(combobox->currentData().toUInt());
|
||||||
return std::to_string(enumeration->at(current).first);
|
|
||||||
};
|
};
|
||||||
|
|
||||||
restore_func = [this, find_index]() {
|
restore_func = [this, find_index]() {
|
||||||
|
|||||||
+15
-11
@@ -12,25 +12,29 @@ namespace Yuzu {
|
|||||||
|
|
||||||
inline bool ContainsAllWords(const QString& haystack, const QString& userinput) {
|
inline bool ContainsAllWords(const QString& haystack, const QString& userinput) {
|
||||||
const QStringList userinput_split = userinput.split(QLatin1Char{' '}, Qt::SkipEmptyParts);
|
const QStringList userinput_split = userinput.split(QLatin1Char{' '}, Qt::SkipEmptyParts);
|
||||||
return std::all_of(userinput_split.begin(), userinput_split.end(),
|
return std::all_of(userinput_split.begin(), userinput_split.end(), [&haystack](const QString& s) {
|
||||||
[&haystack](const QString& s) { return haystack.contains(s); });
|
return haystack.contains(s);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
inline bool FilterMatches(const QString& filter, const QStandardItem* item) {
|
inline bool FilterMatches(const QString& filter, const QStandardItem* item) {
|
||||||
if (filter.isEmpty())
|
if (filter.isEmpty())
|
||||||
return true;
|
return true;
|
||||||
|
|
||||||
|
auto const sluggify = [](const QString& s) {
|
||||||
|
QString o(s.normalized(QString::NormalizationForm_D).toLower());
|
||||||
|
return o.replace(QRegularExpression(QStringLiteral("[^a-z\\s]")), QStringLiteral(""));
|
||||||
|
};
|
||||||
|
|
||||||
|
const auto norm_filter = sluggify(filter);
|
||||||
const auto program_id = item->data(GameListItemPath::ProgramIdRole).toULongLong();
|
const auto program_id = item->data(GameListItemPath::ProgramIdRole).toULongLong();
|
||||||
|
const QString file_path = sluggify(item->data(GameListItemPath::FullPathRole).toString());
|
||||||
const QString file_path = item->data(GameListItemPath::FullPathRole).toString().toLower();
|
const QString file_title = sluggify(item->data(GameListItemPath::TitleRole).toString());
|
||||||
const QString file_title = item->data(GameListItemPath::TitleRole).toString().toLower();
|
|
||||||
const QString file_program_id = QStringLiteral("%1").arg(program_id, 16, 16, QLatin1Char{'0'});
|
const QString file_program_id = QStringLiteral("%1").arg(program_id, 16, 16, QLatin1Char{'0'});
|
||||||
|
const QString file_name = sluggify(file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} + file_title);
|
||||||
const QString file_name =
|
return (ContainsAllWords(file_name, norm_filter)
|
||||||
file_path.mid(file_path.lastIndexOf(QLatin1Char{'/'}) + 1) + QLatin1Char{' '} + file_title;
|
|| ContainsAllWords(file_title, norm_filter))
|
||||||
|
|| (file_program_id.size() == 16 && file_program_id.contains(norm_filter));
|
||||||
return Yuzu::ContainsAllWords(file_name, filter) ||
|
|
||||||
(file_program_id.size() == 16 && file_program_id.contains(filter));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
} // namespace Yuzu
|
} // namespace Yuzu
|
||||||
|
|||||||
@@ -1786,7 +1786,7 @@ bool MainWindow::LoadROM(const QString& filename, Service::AM::FrontendAppletPar
|
|||||||
|
|
||||||
QtCommon::system->SetFrontendAppletSet({
|
QtCommon::system->SetFrontendAppletSet({
|
||||||
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
std::make_unique<QtAmiiboSettings>(*this), // Amiibo Settings
|
||||||
(UISettings::values.controller_applet_disabled.GetValue() == true)
|
(Settings::values.controller_applet_mode.GetValue() == Settings::AppletMode::Disabled)
|
||||||
? nullptr
|
? nullptr
|
||||||
: std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
: std::make_unique<QtControllerSelector>(*this), // Controller Selector
|
||||||
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
std::make_unique<QtErrorDisplay>(*this), // Error Display
|
||||||
|
|||||||
Reference in New Issue
Block a user