diff --git a/.github/workflows/3DS.yml b/.github/workflows/3DS.yml index cd046d7694b..bd2482b27e4 100644 --- a/.github/workflows/3DS.yml +++ b/.github/workflows/3DS.yml @@ -9,6 +9,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/Android.yml b/.github/workflows/Android.yml index 5ef7e910a4b..ae960616a5c 100644 --- a/.github/workflows/Android.yml +++ b/.github/workflows/Android.yml @@ -1,36 +1,39 @@ -name: CI Android - -on: - push: - pull_request: - workflow_dispatch: - repository_dispatch: - types: [run_build] - - -permissions: - contents: read - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v3 - - - name: Compile RA - run: | - cd pkg/android/phoenix - ./gradlew assembleDebug - find . -iname "*.apk" -exec ls -l "{}" \; - - - name: Get short SHA - id: slug - run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - - - uses: actions/upload-artifact@v3 - with: - name: retroarch-android-${{ steps.slug.outputs.sha8 }} - path: | - pkg/android/phoenix/build/outputs/apk/normal/debug/phoenix-normal-debug.apk - pkg/android/phoenix/build/outputs/apk/aarch64/debug/phoenix-aarch64-debug.apk +name: CI Android + +on: + push: + pull_request: + workflow_dispatch: + repository_dispatch: + types: [run_build] + + +permissions: + contents: read + +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v3 + + - name: Compile RA + run: | + cd pkg/android/phoenix + ./gradlew assembleDebug + find . -iname "*.apk" -exec ls -l "{}" \; + + - name: Get short SHA + id: slug + run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" + + - uses: actions/upload-artifact@v3 + with: + name: retroarch-android-${{ steps.slug.outputs.sha8 }} + path: | + pkg/android/phoenix/build/outputs/apk/normal/debug/phoenix-normal-debug.apk + pkg/android/phoenix/build/outputs/apk/aarch64/debug/phoenix-aarch64-debug.apk diff --git a/.github/workflows/DOS-DJGPP.yml b/.github/workflows/DOS-DJGPP.yml index 5e4f21a96a1..d144a2f108d 100644 --- a/.github/workflows/DOS-DJGPP.yml +++ b/.github/workflows/DOS-DJGPP.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-djgpp-build-container:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -f Makefile.dos -j$(getconf _NPROCESSORS_ONLN) clean @@ -27,7 +30,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-DOS-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/Emscripten.yml b/.github/workflows/Emscripten.yml index 737533141e7..d97f8ba3aba 100644 --- a/.github/workflows/Emscripten.yml +++ b/.github/workflows/Emscripten.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-emscripten:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | emmake make -f Makefile.emscripten -j$(getconf _NPROCESSORS_ONLN) clean @@ -27,7 +30,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-Emscripten-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/GameCube.yml b/.github/workflows/GameCube.yml index 215bc7b2b91..0537f44b073 100644 --- a/.github/workflows/GameCube.yml +++ b/.github/workflows/GameCube.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-devkitpro:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -f Makefile.ngc -j$(getconf _NPROCESSORS_ONLN) clean @@ -26,7 +29,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-GameCube-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/Linux.yml b/.github/workflows/Linux.yml index b8e9c6413be..628c280ffcb 100644 --- a/.github/workflows/Linux.yml +++ b/.github/workflows/Linux.yml @@ -9,6 +9,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest diff --git a/.github/workflows/MSVC.yml b/.github/workflows/MSVC.yml index cbda710afdc..478205756b6 100644 --- a/.github/workflows/MSVC.yml +++ b/.github/workflows/MSVC.yml @@ -9,6 +9,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + # These jobs run smoke tests to ensure that MSVC-specific builds work properly. jobs: diff --git a/.github/workflows/MacOS.yml b/.github/workflows/MacOS.yml index e757705b38d..37e6026ee73 100644 --- a/.github/workflows/MacOS.yml +++ b/.github/workflows/MacOS.yml @@ -7,6 +7,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: macos-latest diff --git a/.github/workflows/Miyoo.yml b/.github/workflows/Miyoo.yml index c74aed53841..2a7556ba1a3 100644 --- a/.github/workflows/Miyoo.yml +++ b/.github/workflows/Miyoo.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.miyoo clean @@ -27,7 +30,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: retroarch_miyoo_arm32${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/PS2.yml b/.github/workflows/PS2.yml index c825a595841..eba2153e8ae 100644 --- a/.github/workflows/PS2.yml +++ b/.github/workflows/PS2.yml @@ -9,21 +9,24 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-ps2:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile Salamander run: | make -f Makefile.ps2.salamander -j$(getconf _NPROCESSORS_ONLN) clean make -f Makefile.ps2.salamander -j$(getconf _NPROCESSORS_ONLN) release - + - name: Compile RA run: | make -f Makefile.ps2 -j$(getconf _NPROCESSORS_ONLN) clean @@ -32,10 +35,10 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-PS2-dummy-${{ steps.slug.outputs.sha8 }} path: | raboot.elf - retroarchps2.elf \ No newline at end of file + retroarchps2.elf diff --git a/.github/workflows/PS4-ORBIS.yml b/.github/workflows/PS4-ORBIS.yml index 5460503120b..60773e9bc0e 100644 --- a/.github/workflows/PS4-ORBIS.yml +++ b/.github/workflows/PS4-ORBIS.yml @@ -9,10 +9,13 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-orbis:latest options: --user root @@ -24,7 +27,7 @@ jobs: apk add ncurses-dev make bash python2 apk add libintl icu-dev wget wget https://dot.net/v1/dotnet-install.sh && chmod 755 dotnet-install.sh && ./dotnet-install.sh -c 3.0 --install-dir ~/cli - + - name: Compile RA run: | export PATH=~/cli:$PATH # .net cli @@ -33,7 +36,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: bin-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/PSP.yml b/.github/workflows/PSP.yml index 7bc66566c16..d1b3a9b06a7 100644 --- a/.github/workflows/PSP.yml +++ b/.github/workflows/PSP.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-psp:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile bootstrap run: | cd bootstrap/psp1/kernel_functions_prx @@ -29,7 +32,7 @@ jobs: run: | make -f Makefile.psp1.salamander -j$(getconf _NPROCESSORS_ONLN) clean make -f Makefile.psp1.salamander -j$(getconf _NPROCESSORS_ONLN) - + - name: Compile RA run: | make -f Makefile.psp1 -j$(getconf _NPROCESSORS_ONLN) clean @@ -38,7 +41,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-PSP-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/PSVita.yml b/.github/workflows/PSVita.yml index 7f8e2ae8e14..9be7c3dbfee 100644 --- a/.github/workflows/PSVita.yml +++ b/.github/workflows/PSVita.yml @@ -9,21 +9,24 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-vita:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile Salamander run: | make -f Makefile.vita.salamander -j$(getconf _NPROCESSORS_ONLN) clean make -f Makefile.vita.salamander -j$(getconf _NPROCESSORS_ONLN) - + - name: Compile RA run: | make -f Makefile.vita -j$(getconf _NPROCESSORS_ONLN) clean @@ -31,7 +34,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-PSVita-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/RS90.yml b/.github/workflows/RS90.yml index 99a630c1f1d..1fea310bdf8 100644 --- a/.github/workflows/RS90.yml +++ b/.github/workflows/RS90.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:odbeta options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.rs90 clean @@ -27,7 +30,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: retroarch_rs90_mips32${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/RetroFW.yml b/.github/workflows/RetroFW.yml index 3aa3cf2eeea..24ec76f2ba2 100644 --- a/.github/workflows/RetroFW.yml +++ b/.github/workflows/RetroFW.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-dingux:odbeta options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -j$(getconf _NPROCESSORS_ONLN) -f Makefile.retrofw clean @@ -27,7 +30,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: retroarch_retrofw_mips32${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/SourceRelease.yml b/.github/workflows/SourceRelease.yml index c89434d17e9..7fec60c57ef 100644 --- a/.github/workflows/SourceRelease.yml +++ b/.github/workflows/SourceRelease.yml @@ -9,6 +9,9 @@ on: tags: - "v*.*" +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: name: build diff --git a/.github/workflows/Switch-libnx.yml b/.github/workflows/Switch-libnx.yml index d3041f8244c..75a25054f87 100644 --- a/.github/workflows/Switch-libnx.yml +++ b/.github/workflows/Switch-libnx.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-libnx-devkitpro:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | make -f Makefile.libnx -j$(getconf _NPROCESSORS_ONLN) clean @@ -26,7 +29,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-libnx-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/Wii.yml b/.github/workflows/Wii.yml index dfcfa88379e..fd28b2040af 100644 --- a/.github/workflows/Wii.yml +++ b/.github/workflows/Wii.yml @@ -9,21 +9,24 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-devkitpro:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile Salamander run: | make -f Makefile.wii.salamander -j$(getconf _NPROCESSORS_ONLN) clean make -f Makefile.wii.salamander -j$(getconf _NPROCESSORS_ONLN) EXTERNAL_LIBOGC=1 GX_PTHREAD_LEGACY=0 - + - name: Compile RA run: | make -f Makefile.wii -j$(getconf _NPROCESSORS_ONLN) clean @@ -31,7 +34,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-Wii-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/WiiU.yml b/.github/workflows/WiiU.yml index fca65b108ac..582598dab02 100644 --- a/.github/workflows/WiiU.yml +++ b/.github/workflows/WiiU.yml @@ -9,21 +9,24 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-wiiu:latest options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile Salamander run: | make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) SALAMANDER_BUILD=1 clean make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) SALAMANDER_BUILD=1 - + - name: Compile RA run: | make -f Makefile.wiiu -j$(getconf _NPROCESSORS_ONLN) clean @@ -31,7 +34,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: RA-WiiU-dummy-${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/Windows-i686-MXE.yml b/.github/workflows/Windows-i686-MXE.yml index 9dfe31cd51e..97aa7ab7114 100644 --- a/.github/workflows/Windows-i686-MXE.yml +++ b/.github/workflows/Windows-i686-MXE.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-mxe-win32-cross:gcc10 options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | export MOC=/usr/lib/mxe/usr/i686-w64-mingw32.shared/qt5/bin/moc @@ -29,7 +32,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: retroarch${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/Windows-x64-MXE.yml b/.github/workflows/Windows-x64-MXE.yml index 3ce50603a49..97ea0276319 100644 --- a/.github/workflows/Windows-x64-MXE.yml +++ b/.github/workflows/Windows-x64-MXE.yml @@ -9,16 +9,19 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest - container: + container: image: git.libretro.com:5050/libretro-infrastructure/libretro-build-mxe-win64-cross:gcc10 options: --user root steps: - uses: actions/checkout@v3 - + - name: Compile RA run: | export MOC=/usr/lib/mxe/usr/x86_64-w64-mingw32.shared/qt5/bin/moc @@ -29,7 +32,7 @@ jobs: - name: Get short SHA id: slug run: echo "::set-output name=sha8::$(echo ${GITHUB_SHA} | cut -c1-8)" - + - uses: actions/upload-artifact@v3 with: name: retroarch${{ steps.slug.outputs.sha8 }} diff --git a/.github/workflows/crowdin-daily.yml b/.github/workflows/crowdin-daily.yml index cb2eb994e20..c75dc130e60 100644 --- a/.github/workflows/crowdin-daily.yml +++ b/.github/workflows/crowdin-daily.yml @@ -16,12 +16,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup Java JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 18 distribution: zulu - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: Checkout diff --git a/.github/workflows/crowdin.yml b/.github/workflows/crowdin.yml index 2e1079528de..5ee309af9e9 100644 --- a/.github/workflows/crowdin.yml +++ b/.github/workflows/crowdin.yml @@ -18,12 +18,12 @@ jobs: runs-on: ubuntu-latest steps: - name: Setup Java JDK - uses: actions/setup-java@v3 + uses: actions/setup-java@v4 with: java-version: 18 distribution: zulu - name: Setup Python - uses: actions/setup-python@v4 + uses: actions/setup-python@v5 with: python-version: '3.10' - name: Checkout diff --git a/.github/workflows/retroarch.yml b/.github/workflows/retroarch.yml index b1de465100e..8847aa35e8d 100644 --- a/.github/workflows/retroarch.yml +++ b/.github/workflows/retroarch.yml @@ -13,6 +13,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: linux-c89: # Smoketest build using most restrictive compiler and default options runs-on: ubuntu-latest diff --git a/.github/workflows/webOS.yml b/.github/workflows/webOS.yml index 425c02c9c10..8eb86979490 100644 --- a/.github/workflows/webOS.yml +++ b/.github/workflows/webOS.yml @@ -9,6 +9,9 @@ on: permissions: contents: read +env: + ACTIONS_ALLOW_USE_UNSECURE_NODE_VERSION: true + jobs: build: runs-on: ubuntu-latest @@ -18,7 +21,7 @@ jobs: uses: actions/checkout@v4 - name: Download ares-cli-rs - uses: robinraju/release-downloader@v1.9 + uses: robinraju/release-downloader@v1.11 with: repository: "webosbrew/ares-cli-rs" latest: true @@ -32,7 +35,7 @@ jobs: run: sudo apt-get -yq install ./temp/*.deb - name: Download webOS NDK - uses: robinraju/release-downloader@v1.9 + uses: robinraju/release-downloader@v1.11 with: repository: "openlgtv/buildroot-nc4" latest: true diff --git a/CHANGES.md b/CHANGES.md index 6f637b9af7f..9815b7689d6 100644 --- a/CHANGES.md +++ b/CHANGES.md @@ -1,4 +1,24 @@ # Future +- APPLE: Hide threaded video setting +- CHEEVOS: Add rarity and points to achievement unlock widget +- CHEEVOS: Add rank to leaderboard submission notification +- CLOUDSYNC: Allow saves and configs to be synced optionally +- CLOUDSYNC: Add iCloud cloud sync driver +- CRT/SWITCHRES: Update switchres to 2.2.1 +- GENERAL: Support for mbedtls v3 +- INPUT: Allow to select a preferred/reserved device for each player +- INPUT: Enable Caps, Num, Scroll Lock modifiers on multiple platforms +- INPUT/UDEV: Enable mouse buttons 4 and 5 +- INPUT/WAYLAND: Enable horizontal scroll and mouse buttons 4 and 5 +- INPUT/X11: Enable mouse buttons 4 and 5 +- iOS: Enable vibration by default +- REMOTE RETROPAD: Add gyro/acceleration/light sensor test screen +- TVOS: Support bluetooth keyboards on tvOS +- VIDEO: Show and use exact refresh rate (3 decimals) and interlace/doublestrike where available +- VIDEO: Allow setting viewport bias to offset viewport horizontally/vertically +- VIDEO/D3D: Fix GPU screenshots +- VIDEO/KMS: Force fullscreen when KMS is used +- VIDEO/X11: Support inhibit of Xss screensaver # 1.19.1 - (WASAPI) Only write when running and fix deadlock diff --git a/Makefile.common b/Makefile.common index c8333455523..a469b1c4f6d 100644 --- a/Makefile.common +++ b/Makefile.common @@ -753,7 +753,8 @@ else ifeq ($(HAVE_BUILTINMBEDTLS), 1) OBJ += $(OBJS_TLS_CRYPTO) $(OBJS_TLS_X509) $(OBJS_TLS) else ifeq ($(HAVE_SSL), 1) DEFINES += -DHAVE_SSL - LIBS += $(SYSTEMMBEDTLS_LIBS) + LIBS += $(SYSTEMMBEDTLS_LIBS) $(SYSTEMMBEDX509_LIBS) $(SYSTEMMBEDCRYPTO_LIBS) + DEF_FLAGS += $(SYSTEMMBEDTLS_CFLAGS) $(SYSTEMMBEDX509_CFLAGS) $(SYSTEMMBEDCRYPTO_CFLAGS) endif # Miscellaneous @@ -2449,6 +2450,7 @@ endif ifeq ($(HAVE_TEST_DRIVERS), 1) DEFINES += -DHAVE_TEST_DRIVERS OBJ += input/drivers_joypad/test_joypad.o + OBJ += input/drivers/test_input.o endif diff --git a/audio/common/wasapi.c b/audio/common/wasapi.c index 639dda79d8e..c01e50eda66 100644 --- a/audio/common/wasapi.c +++ b/audio/common/wasapi.c @@ -94,15 +94,14 @@ const char *hresult_name(HRESULT hr) return ""; } -const char *wave_subtype_name(const GUID *guid) +static const char *wave_subtype_name(const GUID *guid) { - if (IsEqualGUID(guid, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + if (!memcmp(guid, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(GUID))) return "KSDATAFORMAT_SUBTYPE_IEEE_FLOAT"; - return ""; } -const char *wave_format_name(const WAVEFORMATEXTENSIBLE *format) +static const char *wave_format_name(const WAVEFORMATEXTENSIBLE *format) { switch (format->Format.wFormatTag) { @@ -200,7 +199,7 @@ static bool wasapi_is_format_suitable(const WAVEFORMATEXTENSIBLE *format) return false; break; case WAVE_FORMAT_EXTENSIBLE: - if (!IsEqualGUID(&format->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT)) + if (!(!memcmp(&format->SubFormat, &KSDATAFORMAT_SUBTYPE_IEEE_FLOAT, sizeof(GUID)))) /* RetroArch doesn't support any other subformat */ return false; @@ -247,11 +246,14 @@ static bool wasapi_select_device_format(WAVEFORMATEXTENSIBLE *format, IAudioClie case S_FALSE: /* The requested format is unsupported, but Windows has suggested a similar one. */ RARCH_DBG("[WASAPI]: Windows suggests a format of (%s, %u-channel, %uHz).\n", - wave_format_name(suggested_format), suggested_format->Format.nChannels, suggested_format->Format.nSamplesPerSec); + wave_format_name(suggested_format), + suggested_format->Format.nChannels, + suggested_format->Format.nSamplesPerSec); + if (wasapi_is_format_suitable(suggested_format)) { *format = *suggested_format; - result = true; + result = true; } else { @@ -281,9 +283,11 @@ static bool wasapi_select_device_format(WAVEFORMATEXTENSIBLE *format, IAudioClie if (SUCCEEDED(format_check_hr)) { *format = possible_format; - result = true; + result = true; RARCH_DBG("[WASAPI]: RetroArch suggests a format of (%s, %u-channel, %uHz).\n", - wave_format_name(format), format->Format.nChannels, format->Format.nSamplesPerSec); + wave_format_name(format), + format->Format.nChannels, + format->Format.nSamplesPerSec); goto done; } } @@ -336,7 +340,10 @@ static IAudioClient *wasapi_init_client_ex(IMMDevice *device, wasapi_set_format(&wf, *float_fmt, *rate, channels); RARCH_DBG("[WASAPI]: Requesting exclusive %u-bit %u-channel client with %s samples at %uHz %ums.\n", wf.Format.wBitsPerSample, - wf.Format.nChannels, wave_format_name(&wf), wf.Format.nSamplesPerSec, latency); + wf.Format.nChannels, + wave_format_name(&wf), + wf.Format.nSamplesPerSec, + latency); if (!wasapi_select_device_format(&wf, client, AUDCLNT_SHAREMODE_EXCLUSIVE, channels)) { @@ -453,7 +460,10 @@ static IAudioClient *wasapi_init_client_sh(IMMDevice *device, wasapi_set_format(&wf, *float_fmt, *rate, channels); RARCH_DBG("[WASAPI]: Requesting shared %u-bit %u-channel client with %s samples at %uHz %ums.\n", wf.Format.wBitsPerSample, - wf.Format.nChannels, wave_format_name(&wf), wf.Format.nSamplesPerSec, latency); + wf.Format.nChannels, + wave_format_name(&wf), + wf.Format.nSamplesPerSec, + latency); if (!wasapi_select_device_format(&wf, client, AUDCLNT_SHAREMODE_SHARED, channels)) { diff --git a/audio/drivers_microphone/wasapi.c b/audio/drivers_microphone/wasapi.c index fac7f8a5ece..fc51e4f175f 100644 --- a/audio/drivers_microphone/wasapi.c +++ b/audio/drivers_microphone/wasapi.c @@ -119,7 +119,7 @@ static int wasapi_microphone_fetch_fifo(wasapi_microphone_handle_t *microphone) /* If the queue has room for the packets we just got... */ if (FIFO_WRITE_AVAIL(microphone->buffer) >= bytes_read && bytes_read > 0) - { + { fifo_write(microphone->buffer, mic_input, bytes_read); /* ...then enqueue the bytes directly from the mic's buffer */ } @@ -140,11 +140,11 @@ static int wasapi_microphone_fetch_fifo(wasapi_microphone_handle_t *microphone) /* If this is a shared-mode stream and we didn't run out of room in the sample queue... */ if (!microphone->exclusive && frames_read > 0) - { + { hr = _IAudioCaptureClient_GetNextPacketSize(microphone->capture, &next_packet_size); /* Get the number of frames that the mic has for us. */ if (FAILED(hr)) - { + { RARCH_ERR("[WASAPI]: Failed to get capture device \"%s\"'s next packet size: %s\n", microphone->device_name, hresult_name(hr)); return -1; @@ -171,7 +171,7 @@ static bool wasapi_microphone_wait_for_capture_event(wasapi_microphone_handle_t { /*...then let's wait for the mic to tell us that samples are ready. */ switch (WaitForSingleObject(microphone->read_event, timeout)) - { + { case WAIT_OBJECT_0: /* Okay, there's data available. */ return true; @@ -212,7 +212,7 @@ static int wasapi_microphone_read_buffered( /* If we don't have any queued samples to give to the core... */ if (!bytes_available) - { + { /* If we couldn't wait for the microphone to signal a capture event... */ if (!wasapi_microphone_wait_for_capture_event(microphone, timeout)) return -1; @@ -294,7 +294,8 @@ static void *wasapi_microphone_open_mic(void *driver_context, const char *device bool float_format = settings->bools.microphone_wasapi_float_format; bool exclusive_mode = settings->bools.microphone_wasapi_exclusive_mode; unsigned sh_buffer_length = settings->uints.microphone_wasapi_sh_buffer_length; - wasapi_microphone_handle_t *microphone = calloc(1, sizeof(wasapi_microphone_handle_t)); + wasapi_microphone_handle_t *microphone = (wasapi_microphone_handle_t*)calloc( + 1, sizeof(wasapi_microphone_handle_t)); if (!microphone) return NULL; @@ -304,7 +305,7 @@ static void *wasapi_microphone_open_mic(void *driver_context, const char *device /* If we requested a particular capture device, but couldn't open it... */ if (device && !microphone->device) - { + { RARCH_WARN("[WASAPI]: Failed to open requested capture device \"%s\", attempting to open default device\n", device); microphone->device = wasapi_init_device(NULL, eCapture); } @@ -343,7 +344,7 @@ static void *wasapi_microphone_open_mic(void *driver_context, const char *device /* If this mic should be used *exclusively* by RetroArch... */ if (microphone->exclusive) - { + { microphone->buffer = fifo_new(microphone->engine_buffer_size); if (!microphone->buffer) { @@ -358,7 +359,7 @@ static void *wasapi_microphone_open_mic(void *driver_context, const char *device { /* If the user selected the "default" shared buffer length... */ if (sh_buffer_length <= 0) - { + { hr = _IAudioClient_GetDevicePeriod(microphone->client, &dev_period, NULL); if (FAILED(hr)) goto error; diff --git a/audio/microphone_driver.c b/audio/microphone_driver.c index 7174311495a..3bd13ae4d47 100644 --- a/audio/microphone_driver.c +++ b/audio/microphone_driver.c @@ -561,7 +561,7 @@ static size_t microphone_driver_flush( /* If this mic provides floating-point samples... */ if (microphone->flags & MICROPHONE_FLAG_USE_FLOAT) { - convert_float_to_s16(mic_st->final_frames, mic_st->input_frames, resampler_data.input_frames); + convert_float_to_s16(mic_st->final_frames, (const float*)mic_st->input_frames, resampler_data.input_frames); fifo_write(microphone->outgoing_samples, mic_st->final_frames, frames_to_enqueue * sizeof(int16_t)); } else @@ -575,11 +575,12 @@ static size_t microphone_driver_flush( /* If this mic provides floating-point samples... */ if (microphone->flags & MICROPHONE_FLAG_USE_FLOAT) /* Samples are already in floating-point, so we just need to up-channel them. */ - convert_to_dual_mono_float(mic_st->dual_mono_frames, mic_st->input_frames, resampler_data.input_frames); + convert_to_dual_mono_float(mic_st->dual_mono_frames, + (const float*)mic_st->input_frames, resampler_data.input_frames); else { /* Samples are 16-bit, so we need to convert them first. */ - convert_s16_to_float(mic_st->converted_input_frames, mic_st->input_frames, resampler_data.input_frames, 1.0f); + convert_s16_to_float(mic_st->converted_input_frames, (const int16_t*)mic_st->input_frames, resampler_data.input_frames, 1.0f); convert_to_dual_mono_float(mic_st->dual_mono_frames, mic_st->converted_input_frames, resampler_data.input_frames); } diff --git a/cheevos/cheevos.c b/cheevos/cheevos.c index 745e45001e6..0ff30b7bd12 100644 --- a/cheevos/cheevos.c +++ b/cheevos/cheevos.c @@ -529,14 +529,28 @@ static void rcheevos_award_achievement(const rc_client_achievement_t* cheevo) #endif } -static void rcheevos_lboard_submit(const rc_client_leaderboard_t* lboard) +static void rcheevos_lboard_submitted(const rc_client_leaderboard_t* lboard, const rc_client_leaderboard_scoreboard_t* scoreboard) { const settings_t* settings = config_get_ptr(); if (lboard && settings->bools.cheevos_visibility_lboard_submit) { char buffer[256]; - snprintf(buffer, sizeof(buffer), msg_hash_to_str(MSG_LEADERBOARD_SUBMISSION), - lboard->tracker_value, lboard->title); + if (scoreboard) + { + char addendum[64]; + const size_t len = snprintf(buffer, sizeof(buffer), msg_hash_to_str(MSG_LEADERBOARD_SUBMISSION), + scoreboard->submitted_score, lboard->title); + if (strcmp(scoreboard->best_score, scoreboard->submitted_score) == 0) + snprintf(addendum, sizeof(addendum), msg_hash_to_str(MSG_LEADERBOARD_RANK), scoreboard->new_rank); + else + snprintf(addendum, sizeof(addendum), msg_hash_to_str(MSG_LEADERBOARD_BEST), scoreboard->best_score); + snprintf(buffer + len, sizeof(buffer) - len, " (%s)", addendum); + } + else + { + snprintf(buffer, sizeof(buffer), msg_hash_to_str(MSG_LEADERBOARD_SUBMISSION), + lboard->tracker_value, lboard->title); + } runloop_msg_queue_push(buffer, 0, 2 * 60, false, NULL, MESSAGE_QUEUE_ICON_DEFAULT, MESSAGE_QUEUE_CATEGORY_INFO); } @@ -696,9 +710,6 @@ static void rcheevos_client_event_handler(const rc_client_event_t* event, rc_cli case RC_CLIENT_EVENT_LEADERBOARD_TRACKER_HIDE: rcheevos_lboard_hide_tracker(event->leaderboard_tracker); break; - case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD: - /* not supported */ - break; #endif case RC_CLIENT_EVENT_ACHIEVEMENT_TRIGGERED: rcheevos_award_achievement(event->achievement); @@ -710,7 +721,10 @@ static void rcheevos_client_event_handler(const rc_client_event_t* event, rc_cli rcheevos_lboard_canceled(event->leaderboard); break; case RC_CLIENT_EVENT_LEADERBOARD_SUBMITTED: - rcheevos_lboard_submit(event->leaderboard); + /* don't notify on submission - report new rank/best score after submission via SCOREBOARD event */ + break; + case RC_CLIENT_EVENT_LEADERBOARD_SCOREBOARD: + rcheevos_lboard_submitted(event->leaderboard, event->leaderboard_scoreboard); break; case RC_CLIENT_EVENT_RESET: command_event(CMD_EVENT_RESET, NULL); /* reset the game */ @@ -3313,7 +3327,7 @@ bool rcheevos_load(const void *data) #endif rc_client_begin_identify_and_load_game(rcheevos_locals.client, RC_CONSOLE_UNKNOWN, - info->path, info->data, info->size, rcheevos_client_load_game_callback, NULL); + info->path, (const uint8_t*)info->data, info->size, rcheevos_client_load_game_callback, NULL); #else /* !HAVE_RC_CLIENT */ #ifdef HAVE_THREADS diff --git a/configuration.c b/configuration.c index 31d2a2a4878..4fb309f11ed 100644 --- a/configuration.c +++ b/configuration.c @@ -1360,6 +1360,18 @@ const char *config_get_default_led(void) return "null"; } +/** + * config_get_default_cloudsync: + * + * Gets default cloud sync driver. + * + * Returns: Default cloud sync driver. + **/ +const char *config_get_default_cloudsync(void) +{ + return "null"; +} + /** * config_get_default_location: * @@ -1680,7 +1692,8 @@ static struct config_path_setting *populate_settings_path( #endif #ifdef HAVE_TEST_DRIVERS - SETTING_PATH("test_input_file_joypad", settings->paths.test_input_file_joypad, false, NULL, true); + SETTING_PATH("test_input_file_joypad", settings->paths.test_input_file_joypad, false, NULL, true); + SETTING_PATH("test_input_file_general", settings->paths.test_input_file_general, false, NULL, true); #endif SETTING_ARRAY("log_dir", settings->paths.log_dir, true, NULL, true); @@ -2717,6 +2730,7 @@ void config_set_defaults(void *data) const char *def_bluetooth = config_get_default_bluetooth(); const char *def_wifi = config_get_default_wifi(); const char *def_led = config_get_default_led(); + const char *def_cloudsync = config_get_default_cloudsync(); const char *def_location = config_get_default_location(); const char *def_record = config_get_default_record(); const char *def_midi = config_get_default_midi(); @@ -2799,6 +2813,10 @@ void config_set_defaults(void *data) configuration_set_string(settings, settings->arrays.led_driver, def_led); + if (def_cloudsync) + configuration_set_string(settings, + settings->arrays.cloud_sync_driver, + def_cloudsync); if (def_location) configuration_set_string(settings, settings->arrays.location_driver, diff --git a/configuration.h b/configuration.h index 81f2db0ea88..086c1d2ab04 100644 --- a/configuration.h +++ b/configuration.h @@ -583,6 +583,7 @@ typedef struct settings #endif #ifdef HAVE_TEST_DRIVERS char test_input_file_joypad[PATH_MAX_LENGTH]; + char test_input_file_general[PATH_MAX_LENGTH]; #endif char log_dir[PATH_MAX_LENGTH]; char app_icon[PATH_MAX_LENGTH]; diff --git a/cores/libretro-net-retropad/net_retropad_core.c b/cores/libretro-net-retropad/net_retropad_core.c index f86ea8eb834..2f7108adc98 100644 --- a/cores/libretro-net-retropad/net_retropad_core.c +++ b/cores/libretro-net-retropad/net_retropad_core.c @@ -8,7 +8,6 @@ * - Allow changing IP address and port in runtime * - Input recording / Combos * - Enable test input loading from menu - * - Visualization of aux inputs (gyro, accelero, light) */ #include @@ -60,8 +59,11 @@ #define KEYBOARD_OFFSET 1000 #define NETRETROPAD_SCREEN_PAD 0 #define NETRETROPAD_SCREEN_KEYBOARD 1 +#define NETRETROPAD_SCREEN_SENSORS 2 +#define EVENT_RATE 60 -struct descriptor { +struct descriptor +{ int device; int port_min; int port_max; @@ -72,7 +74,8 @@ struct descriptor { uint16_t *value; }; -struct remote_joypad_message { +struct remote_joypad_message +{ int port; int device; int index; @@ -82,6 +85,12 @@ struct remote_joypad_message { static bool keyboard_state[RETROK_LAST]; static bool keyboard_state_validated[RETROK_LAST]; +static bool tilt_sensor_enabled = false; +static bool gyro_sensor_enabled = false; +static bool lux_sensor_enabled = false; +static float tilt_sensor_values[3] = {0}; +static float gyro_sensor_values[3] = {0}; +static float lux_sensor_value = 0.0f; static int s; static int port; @@ -97,6 +106,8 @@ static retro_audio_sample_batch_t NETRETROPAD_CORE_PREFIX(audio_batch_cb); static retro_environment_t NETRETROPAD_CORE_PREFIX(environ_cb); static retro_input_poll_t NETRETROPAD_CORE_PREFIX(input_poll_cb); static retro_input_state_t NETRETROPAD_CORE_PREFIX(input_state_cb); +static retro_sensor_get_input_t NETRETROPAD_CORE_PREFIX(sensor_get_input_cb); +static retro_set_sensor_state_t NETRETROPAD_CORE_PREFIX(sensor_set_state_cb); static uint16_t *frame_buf; @@ -130,6 +141,8 @@ static struct descriptor analog_button = { .id_max = RETRO_DEVICE_ID_JOYPAD_R3 }; +/* Sensors are not fed to the descriptors. */ + static struct descriptor *descriptors[] = { &joypad, &analog, @@ -137,6 +150,7 @@ static struct descriptor *descriptors[] = { }; static uint16_t analog_item_colors[32]; +static uint16_t sensor_item_colors[70]; static uint16_t combo_def[] = { @@ -293,7 +307,8 @@ static bool input_test_file_read(const char* file_path) /* Initialise JSON parser */ if (!(parser = rjson_open_rfile(file))) { - NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_ERROR,"[Remote RetroPad]: Failed to create JSON parser.\n"); + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_ERROR, + "[Remote RetroPad]: Failed to create JSON parser.\n"); goto end; } @@ -359,6 +374,38 @@ static bool input_test_file_read(const char* file_path) /* Test input file handling end */ /********************************/ +static void sensors_init(void) +{ + + struct retro_sensor_interface sensor_interface = {0}; + if (NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_GET_SENSOR_INTERFACE, &sensor_interface)) { + + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad]: Sensor interface supported, enabling.\n"); + + NETRETROPAD_CORE_PREFIX(sensor_get_input_cb) = sensor_interface.get_sensor_input; + NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) = sensor_interface.set_sensor_state; + + + if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) && NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)) { + + if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_ENABLE, EVENT_RATE)) { + tilt_sensor_enabled = true; + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad]: Tilt sensor enabled.\n"); + } + + if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_ENABLE, EVENT_RATE)) { + gyro_sensor_enabled = true; + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad]: Gyro sensor enabled.\n"); + } + + if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_ENABLE, EVENT_RATE)) { + lux_sensor_enabled = true; + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG,"[Remote RetroPad]: Lux sensor enabled.\n"); + } + } + } +} + static void draw_background(void) { if (frame_buf) @@ -367,7 +414,7 @@ static void draw_background(void) /* Body is 255 * 142 within the 320 * 240 frame */ uint16_t *pixel = frame_buf + 49 * 320 + 32; - if (current_screen == NETRETROPAD_SCREEN_PAD) + if (current_screen == NETRETROPAD_SCREEN_PAD || current_screen == NETRETROPAD_SCREEN_SENSORS) for (rle = 0; rle < sizeof(body); ) { uint16_t color = 0; @@ -405,6 +452,8 @@ static void flip_screen(void) if (current_screen == NETRETROPAD_SCREEN_PAD) current_screen = NETRETROPAD_SCREEN_KEYBOARD; else if (current_screen == NETRETROPAD_SCREEN_KEYBOARD) + current_screen = NETRETROPAD_SCREEN_SENSORS; + else if (current_screen == NETRETROPAD_SCREEN_SENSORS) current_screen = NETRETROPAD_SCREEN_PAD; draw_background(); } @@ -445,6 +494,13 @@ void NETRETROPAD_CORE_PREFIX(retro_deinit)(void) free(descriptors[i]->value); descriptors[i]->value = NULL; } + + if (NETRETROPAD_CORE_PREFIX(sensor_set_state_cb) && NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)) + { + NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ACCELEROMETER_DISABLE, EVENT_RATE); + NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_GYROSCOPE_DISABLE, EVENT_RATE); + NETRETROPAD_CORE_PREFIX(sensor_set_state_cb)(0, RETRO_SENSOR_ILLUMINANCE_DISABLE, EVENT_RATE); + } } unsigned NETRETROPAD_CORE_PREFIX(retro_api_version)(void) @@ -472,14 +528,14 @@ void NETRETROPAD_CORE_PREFIX(retro_get_system_info)( void NETRETROPAD_CORE_PREFIX(retro_get_system_av_info)( struct retro_system_av_info *info) { - info->timing.fps = 60.0; - info->timing.sample_rate = 30000.0; - - info->geometry.base_width = 320; - info->geometry.base_height = 240; - info->geometry.max_width = 320; - info->geometry.max_height = 240; - info->geometry.aspect_ratio = 4.0 / 3.0; + info->timing.fps = 60.0; + info->timing.sample_rate = 30000.0; + + info->geometry.base_width = 320; + info->geometry.base_height = 240; + info->geometry.max_width = 320; + info->geometry.max_height = 240; + info->geometry.aspect_ratio = 4.0f / 3.0f; } static void NETRETROPAD_CORE_PREFIX(update_keyboard_cb)(bool down, unsigned keycode, @@ -588,13 +644,11 @@ static void open_UDP_socket() if (s && s != SOCKET_ERROR) socket_close(s); - s = socket_create( + if ((s = socket_create( "retropad", SOCKET_DOMAIN_INET, SOCKET_TYPE_DATAGRAM, - SOCKET_PROTOCOL_UDP); - - if (s == SOCKET_ERROR) + SOCKET_PROTOCOL_UDP)) == SOCKET_ERROR) NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "socket failed"); /* setup address structure */ @@ -618,7 +672,7 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) { "net_retropad_ip_octet2", "IP address part 2; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, { "net_retropad_ip_octet3", "IP address part 3; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, { "net_retropad_ip_octet4", "IP address part 4; 0|1|2|3|4|5|6|7|8|9|10|11|12|13|14|15|16|17|18|19|20|21|22|23|24|25|26|27|28|29|30|31|32|33|34|35|36|37|38|39|40|41|42|43|44|45|46|47|48|49|50|51|52|53|54|55|56|57|58|59|60|61|62|63|64|65|66|67|68|69|70|71|72|73|74|75|76|77|78|79|80|81|82|83|84|85|86|87|88|89|90|91|92|93|94|95|96|97|98|99|100|101|102|103|104|105|106|107|108|109|110|111|112|113|114|115|116|117|118|119|120|121|122|123|124|125|126|127|128|129|130|131|132|133|134|135|136|137|138|139|140|141|142|143|144|145|146|147|148|149|150|151|152|153|154|155|156|157|158|159|160|161|162|163|164|165|166|167|168|169|170|171|172|173|174|175|176|177|178|179|180|181|182|183|184|185|186|187|188|189|190|191|192|193|194|195|196|197|198|199|200|201|202|203|204|205|206|207|208|209|210|211|212|213|214|215|216|217|218|219|220|221|222|223|224|225|226|227|228|229|230|231|232|233|234|235|236|237|238|239|240|241|242|243|244|245|246|247|248|249|250|251|252|253|254|255" }, - { "net_retropad_screen", "Start screen; Retropad|Keyboard tester" }, + { "net_retropad_screen", "Start screen; Retropad|Keyboard tester|Sensor tester" }, { "net_retropad_hide_analog_mismatch", "Hide mismatching analog button inputs; True|False" }, { NULL, NULL }, }; @@ -637,7 +691,6 @@ void NETRETROPAD_CORE_PREFIX(retro_set_environment)(retro_environment_t cb) NETRETROPAD_CORE_PREFIX(log_cb) = logger.log; NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_SET_KEYBOARD_CALLBACK, &kcb); - } static void netretropad_check_variables(void) @@ -662,9 +715,10 @@ static void netretropad_check_variables(void) snprintf(server, sizeof(server), "%s.%s.%s.%s", var.value, var2.value, var3.value, var4.value); port = atoi(port_var.value); - if (screen_var.value && - ((current_screen == NETRETROPAD_SCREEN_PAD && strstr(screen_var.value,"Keyboard")) || - (current_screen == NETRETROPAD_SCREEN_KEYBOARD && strstr(screen_var.value,"Retropad")))) + while (screen_var.value && !( + (current_screen == NETRETROPAD_SCREEN_PAD && strstr(screen_var.value,"Retropad")) + || (current_screen == NETRETROPAD_SCREEN_KEYBOARD && strstr(screen_var.value,"Keyboard")) + || (current_screen == NETRETROPAD_SCREEN_SENSORS && strstr(screen_var.value,"Sensor")))) flip_screen(); if (hide_a_var.value && strstr(hide_a_var.value,"True")) hide_analog_mismatch = true; @@ -708,11 +762,15 @@ void NETRETROPAD_CORE_PREFIX(retro_reset)(void) void NETRETROPAD_CORE_PREFIX(retro_run)(void) { int i; + unsigned j; unsigned rle; uint32_t input_state = 0; uint32_t expected_input = 0; uint16_t *pixel = frame_buf + 49 * 320 + 32; + if (!current_frame && current_screen == NETRETROPAD_SCREEN_SENSORS) + sensors_init(); + current_frame++; /* Update input states and send them if needed */ retropad_update_input(); @@ -779,21 +837,98 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) } } + /* Accelerometer and gyroscope. */ + if (tilt_sensor_enabled) + { + tilt_sensor_values[0] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_ACCELEROMETER_X); + tilt_sensor_values[1] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_ACCELEROMETER_Y); + tilt_sensor_values[2] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_ACCELEROMETER_Z); + } + + if (gyro_sensor_enabled) + { + gyro_sensor_values[0] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_GYROSCOPE_X); + gyro_sensor_values[1] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_GYROSCOPE_Y); + gyro_sensor_values[2] = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_GYROSCOPE_Z); + } + + if (lux_sensor_enabled) + lux_sensor_value = NETRETROPAD_CORE_PREFIX(sensor_get_input_cb)(0, RETRO_SENSOR_ILLUMINANCE); + + if (tilt_sensor_enabled || gyro_sensor_enabled || lux_sensor_enabled) + { + int j; + + /*NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_DEBUG, + "[Remote Retropad] %1.3f %1.3f %1.3f %1.3f %1.3f %1.3f %1.3f\n", + tilt_sensor_values[0], tilt_sensor_values[1], tilt_sensor_values[2], + gyro_sensor_values[0], gyro_sensor_values[1], gyro_sensor_values[2], + lux_sensor_value);*/ + + memset(sensor_item_colors, 0, sizeof(sensor_item_colors)); + for (i = 0; i <= 6; i++) + { + unsigned median_index = 5; + bool range_found = false; + float value; + + /* Accelerometer display range: from 0 to 1g, covering tilt from a horizontal to a vertical position. */ + if (i < 3) + { + value = tilt_sensor_values[i]/9.81; + median_index += (i+1)*10; + } + else if (i < 6) + { + value = gyro_sensor_values[i-3]; + median_index += (i+1)*10; + } + else /* Lux sensor approximate range: 10-10000, mapped using log10 / 4 */ + value = lux_sensor_value > 0 ? (float)log10(lux_sensor_value)/4.0f: 0; + + if (value > 1.0f) + value = 1.0f; + else if (value < -1.0f) + value = -1.0f; + + for(j = 3 ; j > 0 && !range_found ; j--) + { + float boundary = j * 0.25f; + if (value > 0 && value > boundary) + { + sensor_item_colors[median_index+j] = (uint16_t)(32*4*(value-boundary)) << 11; + range_found = true; + } + else if (value < 0 && value < boundary*-1.0f) + { + sensor_item_colors[median_index-j] = (uint16_t)(32*4*(boundary-value)) << 11; + range_found = true; + } + } + + if (value != 0.0f && !range_found) + sensor_item_colors[median_index] = (uint16_t)(fabsf(32*4*value)) << 11; + } + } + + /* Input test section start. */ /* Check for predefined combo inputs. */ - for (unsigned j = 0; j < sizeof(combo_def)/sizeof(combo_def[0]); j++) + for (j = 0; j < sizeof(combo_def) / sizeof(combo_def[0]); j++) { if ((input_state & combo_def[j]) == combo_def[j]) combo_state_validated |= 1 << j; } -/* Print a log for A+B combination, but only once while those are pressed */ + /* Print a log for A+B combination, but only once while those are pressed */ if (input_state & ((1 << RETRO_DEVICE_ID_JOYPAD_A | 1 << RETRO_DEVICE_ID_JOYPAD_B) & 0x0000ffff)) { if (!dump_state_blocked) { - NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO,"[Remote RetroPad]: Validated state: %08x combo: %08x\n",input_state_validated, combo_state_validated); + NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, + "[Remote RetroPad]: Validated state: %08x combo: %08x\n", + input_state_validated, combo_state_validated); dump_state_blocked = true; } } @@ -817,19 +952,23 @@ void NETRETROPAD_CORE_PREFIX(retro_run)(void) NETRETROPAD_CORE_PREFIX(log_cb)(RETRO_LOG_INFO, "[Remote RetroPad]: Proceeding to test step %d at frame %d, next: %d\n", current_test_step,current_frame,next_teststep_frame+INITIAL_FRAMES); - if((input_test_steps[current_test_step].expected_button < KEYBOARD_OFFSET && current_screen == NETRETROPAD_SCREEN_KEYBOARD) || - (input_test_steps[current_test_step].expected_button >= KEYBOARD_OFFSET && current_screen == NETRETROPAD_SCREEN_PAD)) + while( + (input_test_steps[current_test_step].expected_button < KEYBOARD_OFFSET && current_screen != NETRETROPAD_SCREEN_PAD) + || (input_test_steps[current_test_step].expected_button >= KEYBOARD_OFFSET && current_screen != NETRETROPAD_SCREEN_KEYBOARD)) flip_screen(); } else { char buf[1024]; + unsigned i; unsigned pass_count = 0; - for(unsigned i=0; i 0; runs--) + { + if (paint) + { + unsigned count; + uint16_t color = 0xffff; + + /* Same color scheme as for retropad buttons */ + if (sensor_item_colors[sensor_buttons[rle]]) + color = sensor_item_colors[sensor_buttons[rle]]; + rle++; + + for (count = sensor_buttons[rle++]; count > 0; count--) + *pixel++ = color; + } + else + pixel += sensor_buttons[rle++]; + + paint = !paint; + } + + pixel += 65; + } + } NETRETROPAD_CORE_PREFIX(video_cb)(frame_buf, 320, 240, 640); retro_sleep(4); @@ -996,7 +1164,7 @@ bool NETRETROPAD_CORE_PREFIX(retro_load_game)(const struct retro_game_info *info else { struct retro_message message; - message.msg = "Initiating test sequence..."; + message.msg = "Initiating test sequence..."; message.frames = INITIAL_FRAMES; NETRETROPAD_CORE_PREFIX(environ_cb)(RETRO_ENVIRONMENT_SET_MESSAGE, &message); } @@ -1007,10 +1175,7 @@ bool NETRETROPAD_CORE_PREFIX(retro_load_game)(const struct retro_game_info *info void NETRETROPAD_CORE_PREFIX(retro_unload_game)(void) {} -unsigned NETRETROPAD_CORE_PREFIX(retro_get_region)(void) -{ - return RETRO_REGION_NTSC; -} +unsigned NETRETROPAD_CORE_PREFIX(retro_get_region)(void) { return RETRO_REGION_NTSC; } bool NETRETROPAD_CORE_PREFIX(retro_load_game_special)(unsigned type, const struct retro_game_info *info, size_t num) @@ -1021,10 +1186,7 @@ bool NETRETROPAD_CORE_PREFIX(retro_load_game_special)(unsigned type, return false; } -size_t NETRETROPAD_CORE_PREFIX(retro_serialize_size)(void) -{ - return 0; -} +size_t NETRETROPAD_CORE_PREFIX(retro_serialize_size)(void) { return 0; } bool NETRETROPAD_CORE_PREFIX(retro_serialize)(void *data, size_t size) { @@ -1047,11 +1209,7 @@ void *NETRETROPAD_CORE_PREFIX(retro_get_memory_data)(unsigned id) return NULL; } -size_t NETRETROPAD_CORE_PREFIX(retro_get_memory_size)(unsigned id) -{ - (void)id; - return 0; -} +size_t NETRETROPAD_CORE_PREFIX(retro_get_memory_size)(unsigned id) { return 0; } void NETRETROPAD_CORE_PREFIX(retro_cheat_reset)(void) {} diff --git a/cores/libretro-net-retropad/remotepad.h b/cores/libretro-net-retropad/remotepad.h index 963a8607430..0d10d007058 100644 --- a/cores/libretro-net-retropad/remotepad.h +++ b/cores/libretro-net-retropad/remotepad.h @@ -592,4 +592,150 @@ static uint16_t keyboard_buttons[] = /* 140 */ 1, 255, /* 141 */ 1, 255, }; + +static uint16_t sensor_buttons[] = +{ + /* 0 */ 1, 255, + /* 1 */ 7, 117, 14, 5, 3, 15, 5, 3, 16, 5, 117, + /* 2 */ 7, 117, 14, 5, 2, 15, 7, 2, 16, 5, 117, + /* 3 */ 11, 111, 13, 4, 1, 14, 6, 1, 15, 9, 1, 16, 6, 1, 17, 4, 111, + /* 4 */ 11, 111, 13, 4, 1, 14, 5, 2, 15, 9, 2, 16, 5, 1, 17, 4, 111, + /* 5 */ 15, 105, 12, 4, 1, 13, 5, 1, 14, 5, 2, 15, 9, 2, 16, 5, 1, 17, 5, 1, 18, 4, 105, + /* 6 */ 15, 105, 12, 4, 1, 13, 4, 2, 14, 5, 2, 15, 9, 2, 16, 5, 2, 17, 4, 1, 18, 4, 105, + /* 7 */ 15, 104, 12, 5, 1, 13, 4, 2, 14, 6, 1, 15, 9, 1, 16, 6, 2, 17, 4, 1, 18, 5, 104, + /* 8 */ 15, 104, 12, 4, 2, 13, 4, 3, 14, 5, 2, 15, 7, 2, 16, 5, 3, 17, 4, 2, 18, 4, 104, + /* 9 */ 15, 104, 12, 4, 2, 13, 5, 2, 14, 5, 3, 15, 5, 3, 16, 5, 2, 17, 5, 2, 18, 4, 104, + /* 10 */ 9, 104, 12, 4, 3, 13, 4, 25, 17, 4, 3, 18, 4, 104, + /* 11 */ 9, 104, 12, 5, 2, 13, 4, 25, 17, 4, 2, 18, 5, 104, + /* 12 */ 5, 105, 12, 4, 37, 18, 4, 105, + /* 13 */ 5, 105, 12, 4, 37, 18, 4, 105, + /* 14 */ 1, 255, + /* 15 */ 1, 255, + /* 16 */ 1, 255, + /* 17 */ 1, 255, + /* 18 */ 1, 255, + /* 19 */ 1, 255, + /* 20 */ 1, 255, + /* 21 */ 1, 255, + /* 22 */ 1, 255, + /* 23 */ 1, 255, + /* 24 */ 1, 255, + /* 25 */ 1, 255, + /* 26 */ 1, 255, + /* 27 */ 1, 255, + /* 28 */ 1, 255, + /* 29 */ 1, 255, + /* 30 */ 1, 255, + /* 31 */ 1, 255, + /* 32 */ 1, 255, + /* 33 */ 1, 255, + /* 34 */ 1, 255, + /* 35 */ 1, 255, + /* 36 */ 1, 255, + /* 37 */ 1, 255, + /* 38 */ 1, 255, + /* 39 */ 1, 255, + /* 40 */ 7, 23, 28, 5, 97, 48, 5, 16, 62, 3, 106, + /* 41 */ 7, 21, 28, 9, 93, 48, 9, 14, 62, 4, 105, + /* 42 */ 7, 20, 28, 11, 92, 48, 9, 14, 62, 5, 104, + /* 43 */ 7, 19, 28, 13, 91, 48, 9, 14, 62, 5, 104, + /* 44 */ 11, 19, 28, 4, 5, 28, 4, 91, 48, 3, 3, 48, 3, 14, 62, 5, 104, + /* 45 */ 3, 146, 62, 5, 104, + /* 46 */ 7, 23, 27, 5, 97, 47, 5, 10, 63, 3, 112, + /* 47 */ 7, 21, 27, 9, 93, 47, 9, 8, 63, 4, 111, + /* 48 */ 7, 20, 27, 11, 92, 47, 9, 8, 63, 5, 110, + /* 49 */ 9, 20, 27, 11, 92, 47, 9, 8, 63, 5, 80, 8, 5, 25, + /* 50 */ 13, 20, 27, 4, 3, 27, 4, 92, 47, 3, 3, 47, 3, 8, 63, 5, 78, 8, 9, 23, + /* 51 */ 5, 140, 63, 5, 77, 8, 11, 22, + /* 52 */ 9, 23, 26, 5, 97, 46, 5, 4, 64, 3, 84, 8, 13, 21, + /* 53 */ 11, 21, 26, 9, 93, 46, 9, 2, 64, 4, 83, 8, 4, 5, 8, 4, 21, + /* 54 */ 7, 21, 26, 9, 93, 46, 9, 2, 64, 5, 116, + /* 55 */ 11, 21, 26, 9, 93, 46, 9, 2, 64, 5, 81, 7, 4, 7, 7, 4, 20, + /* 56 */ 11, 21, 26, 9, 93, 46, 9, 2, 64, 5, 80, 7, 4, 9, 7, 4, 19, + /* 57 */ 13, 21, 26, 3, 3, 26, 3, 93, 46, 3, 3, 46, 3, 87, 7, 4, 9, 7, 4, 19, + /* 58 */ 5, 219, 7, 4, 9, 7, 4, 19, + /* 59 */ 23, 23, 25, 5, 77, 52, 4, 2, 53, 4, 2, 54, 5, 3, 45, 3, 0, 65, 2, 3, 56, 5, 2, 57, 4, 2, 58, 4, 70, 7, 4, 7, 7, 4, 20, + /* 60 */ 19, 22, 25, 7, 76, 52, 4, 2, 53, 4, 2, 54, 5, 2, 45, 4, 0, 65, 3, 2, 56, 5, 2, 57, 4, 2, 58, 4, 105, + /* 61 */ 27, 21, 25, 9, 74, 52, 5, 1, 53, 5, 1, 54, 6, 1, 55, 2, 0, 45, 3, 0, 65, 3, 0, 55, 1, 1, 56, 6, 1, 57, 5, 1, 58, 5, 70, 6, 4, 5, 6, 4, 21, + /* 62 */ 27, 21, 25, 9, 74, 52, 4, 2, 53, 4, 2, 54, 5, 2, 55, 4, 0, 45, 1, 0, 65, 1, 0, 55, 3, 2, 56, 5, 2, 57, 4, 2, 58, 4, 70, 6, 4, 5, 6, 4, 21, + /* 63 */ 21, 21, 25, 9, 74, 52, 4, 2, 53, 4, 2, 54, 5, 2, 55, 9, 2, 56, 5, 2, 57, 4, 2, 58, 4, 71, 6, 4, 3, 6, 4, 22, + /* 64 */ 25, 21, 25, 9, 74, 52, 4, 2, 53, 4, 2, 54, 5, 2, 55, 4, 0, 65, 1, 0, 45, 1, 0, 55, 3, 2, 56, 5, 2, 57, 4, 2, 58, 4, 71, 6, 11, 22, + /* 65 */ 25, 21, 25, 9, 74, 52, 5, 1, 53, 5, 1, 54, 6, 1, 55, 3, 0, 65, 2, 0, 45, 3, 0, 55, 1, 1, 56, 6, 1, 57, 5, 1, 58, 5, 71, 6, 11, 22, + /* 66 */ 23, 22, 25, 7, 76, 52, 4, 2, 53, 4, 2, 54, 5, 2, 55, 1, 0, 65, 3, 0, 45, 3, 2, 56, 5, 2, 57, 4, 2, 58, 4, 73, 6, 9, 23, + /* 67 */ 19, 23, 25, 5, 77, 52, 4, 2, 53, 4, 2, 54, 5, 3, 65, 3, 0, 45, 2, 3, 56, 5, 2, 57, 4, 2, 58, 4, 105, + /* 68 */ 3, 225, 5, 5, 25, + /* 69 */ 11, 21, 24, 3, 3, 24, 3, 93, 44, 3, 3, 44, 3, 92, 5, 7, 24, + /* 70 */ 9, 21, 24, 9, 86, 66, 5, 2, 44, 9, 91, 5, 9, 23, + /* 71 */ 9, 21, 24, 9, 86, 66, 5, 2, 44, 9, 91, 5, 9, 23, + /* 72 */ 9, 21, 24, 9, 86, 66, 5, 2, 44, 9, 91, 5, 9, 23, + /* 73 */ 9, 21, 24, 9, 87, 66, 4, 2, 44, 9, 91, 5, 9, 23, + /* 74 */ 9, 23, 24, 5, 90, 66, 3, 4, 44, 5, 93, 5, 9, 23, + /* 75 */ 3, 224, 5, 7, 24, + /* 76 */ 13, 22, 23, 2, 3, 23, 2, 81, 67, 5, 8, 43, 3, 3, 43, 3, 93, 5, 5, 25, + /* 77 */ 7, 22, 23, 7, 81, 67, 5, 8, 43, 9, 123, + /* 78 */ 7, 22, 23, 7, 81, 67, 5, 8, 43, 9, 123, + /* 79 */ 7, 22, 23, 7, 82, 67, 4, 8, 43, 9, 123, + /* 80 */ 7, 23, 23, 5, 84, 67, 3, 10, 43, 5, 125, + /* 81 */ 1, 255, + /* 82 */ 11, 23, 22, 1, 3, 22, 1, 76, 68, 5, 14, 42, 3, 3, 42, 3, 123, + /* 83 */ 7, 23, 22, 5, 76, 68, 5, 14, 42, 9, 123, + /* 84 */ 7, 23, 22, 5, 76, 68, 5, 14, 42, 9, 123, + /* 85 */ 7, 23, 22, 5, 77, 68, 4, 14, 42, 9, 123, + /* 86 */ 7, 24, 22, 3, 79, 68, 3, 16, 42, 5, 125, + /* 87 */ 1, 255, + /* 88 */ 1, 255, + /* 89 */ 1, 255, + /* 90 */ 1, 255, + /* 91 */ 1, 255, + /* 92 */ 1, 255, + /* 93 */ 1, 255, + /* 94 */ 1, 255, + /* 95 */ 1, 255, + /* 96 */ 1, 255, + /* 97 */ 1, 255, + /* 98 */ 1, 255, + /* 99 */ 1, 255, + /* 100 */ 1, 255, + /* 101 */ 1, 255, + /* 102 */ 1, 255, + /* 103 */ 1, 255, + /* 104 */ 1, 255, + /* 105 */ 1, 255, + /* 106 */ 1, 255, + /* 107 */ 1, 255, + /* 108 */ 1, 255, + /* 109 */ 1, 255, + /* 110 */ 1, 255, + /* 111 */ 1, 255, + /* 112 */ 1, 255, + /* 113 */ 1, 255, + /* 114 */ 1, 255, + /* 115 */ 1, 255, + /* 116 */ 1, 255, + /* 117 */ 1, 255, + /* 118 */ 1, 255, + /* 119 */ 1, 255, + /* 120 */ 1, 255, + /* 121 */ 1, 255, + /* 122 */ 1, 255, + /* 123 */ 1, 255, + /* 124 */ 1, 255, + /* 125 */ 1, 255, + /* 126 */ 1, 255, + /* 127 */ 1, 255, + /* 128 */ 1, 255, + /* 129 */ 1, 255, + /* 130 */ 1, 255, + /* 131 */ 1, 255, + /* 132 */ 1, 255, + /* 133 */ 1, 255, + /* 134 */ 1, 255, + /* 135 */ 1, 255, + /* 136 */ 1, 255, + /* 137 */ 1, 255, + /* 138 */ 1, 255, + /* 139 */ 1, 255, + /* 140 */ 1, 255, + /* 141 */ 1, 255, +}; #endif /* REMOTEPAD_H */ diff --git a/deps/rcheevos/src/rcheevos/runtime.c b/deps/rcheevos/src/rcheevos/runtime.c index 25e9885dcf9..09c3aee217b 100644 --- a/deps/rcheevos/src/rcheevos/runtime.c +++ b/deps/rcheevos/src/rcheevos/runtime.c @@ -10,7 +10,7 @@ #define RC_RICHPRESENCE_DISPLAY_BUFFER_SIZE 256 rc_runtime_t* rc_runtime_alloc(void) { - rc_runtime_t* self = malloc(sizeof(rc_runtime_t)); + rc_runtime_t* self = (rc_runtime_t*)malloc(sizeof(rc_runtime_t)); if (self) { rc_runtime_init(self); @@ -834,7 +834,7 @@ void rc_runtime_invalidate_address(rc_runtime_t* self, uint32_t address) { } } -void rc_runtime_validate_addresses(rc_runtime_t* self, rc_runtime_event_handler_t event_handler, +void rc_runtime_validate_addresses(rc_runtime_t* self, rc_runtime_event_handler_t event_handler, rc_runtime_validate_address_t validate_handler) { rc_memref_t** last_memref = &self->memrefs; rc_memref_t* memref = self->memrefs; diff --git a/deps/switchres/.github/workflows/build.yml b/deps/switchres/.github/workflows/build.yml index f363537afa2..23a5081dbdf 100644 --- a/deps/switchres/.github/workflows/build.yml +++ b/deps/switchres/.github/workflows/build.yml @@ -9,16 +9,16 @@ jobs: strategy: matrix: platform: - - { name: Linux GCC } - - { name: Windows MINGW, make_opts: PLATFORM=NT CROSS_COMPILE=x86_64-w64-mingw32- } + - { name: linux_gcc } + - { name: windows_mingw, make_opts: PLATFORM=NT CROSS_COMPILE=x86_64-w64-mingw32- } steps: - uses: actions/checkout@v3 - name: Install Linux dependencies - if: matrix.platform.name == 'Linux GCC' + if: matrix.platform.name == 'linux_gcc' run: sudo apt-get install libxrandr-dev libdrm-dev libsdl2-dev - name: Install Windows dependencies - if: matrix.platform.name == 'Windows MINGW' + if: matrix.platform.name == 'windows_mingw' run: | sudo apt-get install mingw-w64 wget tar sudo update-alternatives --set x86_64-w64-mingw32-g++ /usr/bin/x86_64-w64-mingw32-g++-posix @@ -33,7 +33,7 @@ jobs: make libswitchres ${{matrix.platform.make_opts}} make ${{matrix.platform.make_opts}} - name: Build grid.exe (Windows only) - if: matrix.platform.name == 'Windows MINGW' + if: matrix.platform.name == 'windows_mingw' run: | make ${{matrix.platform.make_opts}} clean make ${{matrix.platform.make_opts}} grid @@ -62,3 +62,32 @@ jobs: with: name: geometry-win32-x86_64 path: dist/ + + release: + + runs-on: ubuntu-latest + needs: [buildx86_64, win32-build-x86_64-geometry] + if: startsWith(github.ref, 'refs/tags/v') + steps: + - name: Get version + id: get_version + run: echo ::set-output name=VERSION::${GITHUB_REF#refs/tags/} + - name: Download artifacts + uses: actions/download-artifact@v2.0.5 + - name: Make packages + run: | + tag="${GITHUB_REF#refs/tags/}" + mv ./geometry-win32-x86_64/geometry.exe ./switchres-windows_mingw-x86_64 + 7z a "switchres-${tag}-windows_mingw-x86_64.7z" ./switchres-windows_mingw-x86_64 + tar cvjf switchres-${tag}-linux_gcc-x86_64.tar.bz2 ./switchres-linux_gcc-x86_64 + - name: Create release + uses: softprops/action-gh-release@v1 + env: + GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} + with: + name: Switchres ${{ steps.get_version.outputs.VERSION }} + draft: true + prerelease: false + files: | + ./*.bz2 + ./*.7z diff --git a/deps/switchres/README.md b/deps/switchres/README.md index 9ee0fc8e117..5eaed04ff5b 100644 --- a/deps/switchres/README.md +++ b/deps/switchres/README.md @@ -1,4 +1,4 @@ -# What is Switchres 2.0 +# What is Switchres Switchres is a modeline generation engine for emulation. Its purpose is on-the-fly creation of fully customized video modes that accurately reproduce those of the emulated systems. Based on a monitor profile, it will provide the best video mode for a given width, height, and refresh rate. @@ -7,7 +7,7 @@ Switchres features the most versatile modeline generation ever, ranging from 15- Switchres can be integrated into open-source emulators either as a library, or used as a standalone emulator launcher. It's written in C++ and a C wrapper is also available. -Switchres 2.0 is a rewrite of the original Switchres code used in GroovyMAME. It currently supports mode switching on the following platforms, with their respective backends: +Switchres is a rewrite of the original Switchres code used in GroovyMAME. It currently supports mode switching on the following platforms, with their respective backends: - **Windows**: - AMD ADL (AMD Radeon HD 5000+) - ATI legacy (ATI Radeon pre-HD 5000) @@ -37,12 +37,17 @@ Options: -l, --launch Launch -m, --monitor Monitor preset (generic_15, arcade_15, pal, ntsc, etc.) -a --aspect Monitor aspect ratio - -r --rotated Original mode's native orientation is rotated - -d, --display Use target display (Windows: \\\\.\\DISPLAY1, ... Linux: VGA-0, ...) + -r --rotated Rotate axes, preserving aspect ratio + -d, --display Use target display (index = 0, 1, 2...) -f, --force x@ Force a specific video mode from display mode list -i, --ini Specify an ini file - -b, --backend Specify the api name -k, --keep Keep changes on exit (warning: this disables cleanup) + -g, --geometry Adjust geometry of generated modeline + adjustment = :: + e.g. switchres 640 480 60 -c -g 1.1:-1:2 + +For more options, refer to switchres.ini. All options in switchres.ini can be applied in +command line as long options, e.g.: switchres 256 224 57.55 -c --dotclock_min 8.0 ``` A default `switchres.ini` file will be searched in the current working directory, then in `.\ini` on Windows, `./ini` then `/etc` on Linux. The repo has a switchres.ini example. diff --git a/deps/switchres/custom_video_drmkms.cpp b/deps/switchres/custom_video_drmkms.cpp index f71c49ca1d6..c7c2d0a3b16 100755 --- a/deps/switchres/custom_video_drmkms.cpp +++ b/deps/switchres/custom_video_drmkms.cpp @@ -47,11 +47,22 @@ #define drmModeFreePlaneResources p_drmModeFreePlaneResources #define drmIoctl p_drmIoctl #define drmGetCap p_drmGetCap +#define drmGetDevices2 p_drmGetDevices2 #define drmIsMaster p_drmIsMaster #define drmSetMaster p_drmSetMaster #define drmDropMaster p_drmDropMaster # define MAX_CARD_ID 10 +# define MAX_DRM_DEVICES 16 + +// To enable libdrmhook: make SR_WITH_DRMHOOK=1 +#ifdef SR_WITH_DRMHOOK + #define hook_handle RTLD_DEFAULT + #define hook_log " (will attempt hook)" +#else + #define hook_handle mp_drm_handle + #define hook_log "" +#endif //============================================================ // shared the privileges of the master fd @@ -212,6 +223,13 @@ bool drmkms_timing::test_kernel_user_modes() // Count the number of existing modes, so it should be +1 when attaching // a new mode. Could also check the mode name, still better conn = drmModeGetConnector(fd, m_desktop_output); + if (!conn) + { + log_verbose("DRM/KMS: <%d> (%s) Cannot get connector\n", m_id, __FUNCTION__); + m_kernel_user_modes = false; + return false; + } + first_modes_count = conn->count_modes; ret = drmModeAttachMode(fd, m_desktop_output, &mode); drmModeFreeConnector(conn); @@ -329,7 +347,7 @@ drmkms_timing::~drmkms_timing() bool drmkms_timing::init() { - log_verbose("DRM/KMS: <%d> (init) loading DRM/KMS library\n", m_id); + log_verbose("DRM/KMS: <%d> (init) loading DRM/KMS library%s\n", m_id, hook_log); mp_drm_handle = dlopen("libdrm.so", RTLD_NOW); if (mp_drm_handle) { @@ -354,21 +372,21 @@ bool drmkms_timing::init() return false; } - p_drmModeGetConnector = (__typeof__(drmModeGetConnector)) dlsym(RTLD_DEFAULT, "drmModeGetConnector"); + p_drmModeGetConnector = (__typeof__(drmModeGetConnector)) dlsym(hook_handle, "drmModeGetConnector"); if (p_drmModeGetConnector == NULL) { log_error("DRM/KMS: <%d> (init) [ERROR] missing func %s in %s", m_id, "drmModeGetConnector", "DRM_LIBRARY"); return false; } - p_drmModeGetConnectorCurrent = (__typeof__(drmModeGetConnectorCurrent)) dlsym(RTLD_DEFAULT, "drmModeGetConnectorCurrent"); + p_drmModeGetConnectorCurrent = (__typeof__(drmModeGetConnectorCurrent)) dlsym(hook_handle, "drmModeGetConnectorCurrent"); if (p_drmModeGetConnectorCurrent == NULL) { log_error("DRM/KMS: <%d> (init) [ERROR] missing func %s in %s", m_id, "drmModeGetConnectorCurrent", "DRM_LIBRARY"); return false; } - p_drmModeFreeConnector = (__typeof__(drmModeFreeConnector)) dlsym(RTLD_DEFAULT, "drmModeFreeConnector"); + p_drmModeFreeConnector = (__typeof__(drmModeFreeConnector)) dlsym(hook_handle, "drmModeFreeConnector"); if (p_drmModeFreeConnector == NULL) { log_error("DRM/KMS: <%d> (init) [ERROR] missing func %s in %s", m_id, "drmModeFreeConnector", "DRM_LIBRARY"); @@ -494,6 +512,13 @@ bool drmkms_timing::init() return false; } + p_drmGetDevices2 = (__typeof__(drmGetDevices2)) dlsym(mp_drm_handle, "drmGetDevices2"); + if (p_drmGetDevices2 == NULL) + { + log_error("DRM/KMS: <%d> (init) [ERROR] missing func %s in %s", m_id, "drmGetDevices2", "DRM_LIBRARY"); + return false; + } + p_drmIsMaster = (__typeof__(drmIsMaster)) dlsym(mp_drm_handle, "drmIsMaster"); if (p_drmIsMaster == NULL) { @@ -529,14 +554,31 @@ bool drmkms_timing::init() else if (strlen(m_device_name) == 1 && m_device_name[0] >= '0' && m_device_name[0] <= '9') screen_pos = m_device_name[0] - '0'; - char drm_name[15] = "/dev/dri/card_"; + // Get an array of drm devices to check + drmDevicePtr devices[MAX_DRM_DEVICES]; + int num_devices = drmGetDevices2(0, NULL, 0); + + if (num_devices > MAX_DRM_DEVICES) + num_devices = MAX_DRM_DEVICES; + + int ret = drmGetDevices2(0, devices, num_devices); + if (ret < 0) + { + log_error("DRM/KMS: drmGetDevices2() returned an error %d\n", ret); + return false; + } + + char *drm_name; drmModeRes *p_res; drmModeConnector *p_connector; int output_position = 0; - for (int num = 0; !m_desktop_output && num < MAX_CARD_ID; num++) + for (int num = 0; num < num_devices; num++) { - drm_name[13] = '0' + num; + // Skip non-primary nodes + if (devices[num]->available_nodes & (1 << DRM_NODE_PRIMARY)) + drm_name = devices[num]->nodes[DRM_NODE_PRIMARY]; + else continue; if (!access(drm_name, F_OK) == 0) { @@ -554,7 +596,10 @@ bool drmkms_timing::init() log_error("DRM/KMS: <%d> (init) [ERROR] ioctl DRM_CAP_DUMB_BUFFER\n", m_id); if (!check_dumb) + { log_error("DRM/KMS: <%d> (init) [ERROR] dumb buffer not supported\n", m_id); + continue; + } p_res = drmModeGetResources(m_drm_fd); @@ -582,6 +627,7 @@ bool drmkms_timing::init() } m_desktop_output = p_connector->connector_id; m_card_id = num; + strcpy(m_drm_name, drm_name); log_verbose("DRM/KMS: <%d> (init) card %d connector %d id %d name %s selected as primary output\n", m_id, num, i, m_desktop_output, connector_name); drmModeEncoder *p_encoder = drmModeGetEncoder(m_drm_fd, p_connector->encoder_id); @@ -601,7 +647,10 @@ bool drmkms_timing::init() } } if (!mp_crtc_desktop) + { + m_desktop_output = 0; log_error("DRM/KMS: <%d> (init) [ERROR] no crtc found\n", m_id); + } drmModeFreeEncoder(p_encoder); } output_position++; @@ -649,9 +698,14 @@ bool drmkms_timing::init() s_shared_count[m_card_id] = 2; } if (!drmIsMaster(m_drm_fd)) + { + m_desktop_output = 0; log_error("DRM/KMS: <%d> (%s) [ERROR] limited DRM rights on this screen\n", m_id, __FUNCTION__); + } } } + // If we're here and we have a valid output, we're done. + if (m_desktop_output) break; } } @@ -697,9 +751,8 @@ bool drmkms_timing::init() int drmkms_timing::get_master_fd() { - const size_t path_length = 15; - char dev_path[path_length]; - char procpath[50]; + const size_t path_length = 20; + char procpath[path_length]; char fullpath[512]; char* actualpath; struct stat st; @@ -721,10 +774,9 @@ int drmkms_timing::get_master_fd() return -1; } - snprintf(dev_path, path_length, "/dev/dri/card%d", m_card_id); - if (!access(dev_path, F_OK) == 0) + if (!access(m_drm_name, F_OK) == 0) { - log_error("DRM/KMS: <%d> (%s) [ERROR] Device %s doesn't exist\n", m_id, __FUNCTION__, dev_path); + log_error("DRM/KMS: <%d> (%s) [ERROR] Device %s doesn't exist\n", m_id, __FUNCTION__, m_drm_name); return -1; } @@ -749,7 +801,7 @@ int drmkms_timing::get_master_fd() continue; actualpath = realpath(fullpath, NULL); // Only check the device we expect - if (strncmp(dev_path, actualpath, path_length) != 0) + if (strncmp(m_drm_name, actualpath, path_length) != 0) { free(actualpath); continue; @@ -770,16 +822,16 @@ int drmkms_timing::get_master_fd() // CASE 3: m_drm_fd is not a master (and probably not even a valid FD), the currend pid doesn't have master rights // Or master is owned by a 3rd party app (like a frontend ...) - log_verbose("DRM/KMS: <%d> (%s) Couldn't find a master FD, opening default /dev/dri/card%d\n", m_id, __FUNCTION__, m_card_id); + log_verbose("DRM/KMS: <%d> (%s) Couldn't find a master FD, opening default %s\n", m_id, __FUNCTION__, m_drm_name); // mark our former hook as invalid m_hook_fd = -1; - fd = open(dev_path, O_RDWR | O_CLOEXEC); + fd = open(m_drm_name, O_RDWR | O_CLOEXEC); if (fd < 0) { // Oh, we're totally screwed here, worst possible scenario - log_error("DRM/KMS: <%d> (%s) Can't open /dev/dri/card%d, can't get master rights\n", m_id, __FUNCTION__, m_card_id); + log_error("DRM/KMS: <%d> (%s) Can't open %s, can't get master rights\n", m_id, __FUNCTION__, m_drm_name); return -1; } diff --git a/deps/switchres/custom_video_drmkms.h b/deps/switchres/custom_video_drmkms.h index 43e2a3acf47..c4b526afb1c 100755 --- a/deps/switchres/custom_video_drmkms.h +++ b/deps/switchres/custom_video_drmkms.h @@ -53,6 +53,7 @@ class drmkms_timing : public custom_video int m_caps = 0; char m_device_name[32]; + char m_drm_name[32]; unsigned int m_desktop_output = 0; int m_video_modes_position = 0; @@ -83,6 +84,7 @@ class drmkms_timing : public custom_video __typeof__(drmModeFreePlaneResources) *p_drmModeFreePlaneResources; __typeof__(drmIoctl) *p_drmIoctl; __typeof__(drmGetCap) *p_drmGetCap; + __typeof__(drmGetDevices2) *p_drmGetDevices2; __typeof__(drmIsMaster) *p_drmIsMaster; __typeof__(drmSetMaster) *p_drmSetMaster; __typeof__(drmDropMaster) *p_drmDropMaster; diff --git a/deps/switchres/display.cpp b/deps/switchres/display.cpp index 2fc58634bcf..6f70997f81b 100644 --- a/deps/switchres/display.cpp +++ b/deps/switchres/display.cpp @@ -104,7 +104,6 @@ void display_manager::parse_options() void display_manager::set_preset(const char *preset) { - strncpy(m_ds.monitor, preset, sizeof(m_ds.monitor)-1); for (size_t i = 0; i < strlen(m_ds.monitor); i++) m_ds.monitor[i] = tolower(m_ds.monitor[i]); memset(&range[0], 0, sizeof(struct monitor_range) * MAX_RANGES); diff --git a/deps/switchres/display.h b/deps/switchres/display.h index ddcaf3e3d02..e3acf7f6ed6 100644 --- a/deps/switchres/display.h +++ b/deps/switchres/display.h @@ -97,6 +97,7 @@ class display_manager int v_shift_correct() { return m_ds.gs.v_shift_correct; } int pixel_precision() { return m_ds.gs.pixel_precision; } int interlace_force_even() { return m_ds.gs.interlace_force_even; } + int scale_proportional() { return m_ds.gs.scale_proportional; } // getters (modeline result) bool got_mode() { return (m_selected_mode != nullptr); } @@ -134,7 +135,7 @@ class display_manager void set_current_mode(modeline *mode) { m_current_mode = mode; } // setters (display_manager) - void set_monitor(const char *preset) { set_preset(preset); } + void set_monitor(const char *preset) { strncpy(m_ds.monitor, preset, sizeof(m_ds.monitor)-1); set_preset(preset); } void set_modeline(const char *modeline) { strncpy(m_ds.user_modeline, modeline, sizeof(m_ds.user_modeline)-1); } void set_crt_range(int i, const char *range) { strncpy(m_ds.crt_range[i], range, sizeof(m_ds.crt_range[i])-1); } void set_lcd_range(const char *range) { strncpy(m_ds.lcd_range, range, sizeof(m_ds.lcd_range)-1); } @@ -161,6 +162,7 @@ class display_manager void set_v_shift_correct(int value) { m_ds.gs.v_shift_correct = value; } void set_pixel_precision(int value) { m_ds.gs.pixel_precision = value; } void set_interlace_force_even(int value) { m_ds.gs.interlace_force_even = value; } + void set_scale_proportional(int value) { m_ds.gs.scale_proportional = value; } // setters (custom_video backend) void set_screen_compositing(bool value) { m_ds.vs.screen_compositing = value; } diff --git a/deps/switchres/display_sdl2.cpp b/deps/switchres/display_sdl2.cpp index 5416fe17a43..d8bf892aed9 100644 --- a/deps/switchres/display_sdl2.cpp +++ b/deps/switchres/display_sdl2.cpp @@ -19,65 +19,6 @@ #include "display_sdl2.h" #include "log.h" -//============================================================ -// custom_video::get_sdl_hwinfo_from_sdl_window -//============================================================ -void get_sdl_hwinfo_from_sdl_window(SDL_Window* window) -{ - SDL_SysWMinfo m_sdlwminfo; - - SDL_VERSION(&m_sdlwminfo.version); - if(! SDL_GetWindowWMInfo(window, &m_sdlwminfo)) - { - log_error("Couldn't get the SDL WMInfo\n"); - return; - } - const char *subsystem = "an unsupported or unknown system!"; - switch((int)m_sdlwminfo.subsystem) - { - case SDL_SYSWM_UNKNOWN: - case SDL_SYSWM_COCOA: - case SDL_SYSWM_UIKIT: -#if SDL_VERSION_ATLEAST(2, 0, 2) - case SDL_SYSWM_WAYLAND: -#endif - case SDL_SYSWM_MIR: -#if SDL_VERSION_ATLEAST(2, 0, 3) - case SDL_SYSWM_WINRT: -#endif -#if SDL_VERSION_ATLEAST(2, 0, 4) - case SDL_SYSWM_ANDROID: -#endif -#if SDL_VERSION_ATLEAST(2, 0, 5) - case SDL_SYSWM_VIVANTE: -#endif -#if SDL_VERSION_ATLEAST(2, 0, 6) - case SDL_SYSWM_OS2: -#endif -#if SDL_VERSION_ATLEAST(2, 0, 12) - case SDL_SYSWM_HAIKU: -#endif - case SDL_SYSWM_DIRECTFB: - break; - case SDL_SYSWM_WINDOWS: - subsystem = "Microsoft Windows(TM)"; - break; - case SDL_SYSWM_X11: - subsystem = "X Window System"; - break; -#if SDL_VERSION_ATLEAST(2, 0, 16) - case SDL_SYSWM_KMSDRM: - subsystem = "KMSDRM"; - break; -#endif - } - log_info("Switchres/SDL2: Detected SDL version %d.%d.%d on %s\n", - (int)m_sdlwminfo.version.major, - (int)m_sdlwminfo.version.minor, - (int)m_sdlwminfo.version.patch, - subsystem); -} - //============================================================ // sdl2_display::sdl2_display @@ -147,6 +88,11 @@ bool sdl2_display::init(void* pf_data) //SDL_LogSetAllPriority(SDL_LOG_PRIORITY_DEBUG); + // Get SDL version information + SDL_version version; + SDL_GetVersion(&version); + log_info("Switchres/SDL2: Detected SDL version %d.%d.%d\n", (int)version.major, (int)version.minor, (int)version.patch); + SDL_Window* window = NULL; Uint32 id = 0; @@ -185,9 +131,6 @@ bool sdl2_display::init(void* pf_data) log_verbose("Switchres/SDL2: (%s:%d) No SDL2 window found, don't expect things to work good\n", __FUNCTION__, __LINE__); } - if(m_sdlwindow) - get_sdl_hwinfo_from_sdl_window(m_sdlwindow); - // Need a check to see if SDL2 can refresh the modelist return true; } diff --git a/deps/switchres/examples/switch_refresh.cpp b/deps/switchres/examples/switch_refresh.cpp new file mode 100644 index 00000000000..48e9d01a4d0 --- /dev/null +++ b/deps/switchres/examples/switch_refresh.cpp @@ -0,0 +1,48 @@ +// Test switching of refresh rate only +// Requires working update method +// +// Build: g++ -o switch_refresh switch_refresh.cpp -I ../ -L ../ -ldl -lswitchres -lSDL2 -lSDL2_ttf -ldrm + +#include +#include +#include + +int main(int argc, char** argv) +{ + sr_mode srm; + + sr_set_log_level(3); + sr_init(); + sr_set_disp(-1); + sr_set_monitor("arcade_31"); + sr_init_disp("1", NULL); + + printf("Testing first refresh (50Hz). Press any key...\n"); + getchar(); + + if (!sr_add_mode(648, 480, 50, 0, &srm)) + goto error; + + if (!sr_set_mode(srm.id)) + goto error; + + printf("Testing second refresh (60Hz). Press any key...\n"); + getchar(); + + if(!sr_add_mode(648, 480, 60, 0, &srm)) + goto error; + + if(!sr_set_mode(srm.id)) + goto error; + + printf("Success. Press any key to quit.\n"); + getchar(); + + sr_deinit(); + exit(0); + +error: + printf("ERROR: Exiting!\n"); + sr_deinit(); + exit(1); +} diff --git a/deps/switchres/makefile b/deps/switchres/makefile index 89f52e0a782..6811ca43fdc 100644 --- a/deps/switchres/makefile +++ b/deps/switchres/makefile @@ -64,6 +64,9 @@ else CPPFLAGS += -DSR_WITH_KMSDRM EXTRA_LIBS = libdrm SRC += custom_video_drmkms.cpp + ifeq ($(SR_WITH_DRMHOOK),1) + CPPFLAGS += -DSR_WITH_DRMHOOK + endif endif # SDL2 misses a test for drm as drm.h is required @@ -150,8 +153,8 @@ install: $(INSTALL) -Dm644 switchres.h $(INCDIR)/switchres/switchres.h $(INSTALL) -Dm644 switchres.pc $(PKGDIR)/switchres.pc ifneq ($(SO_NAME),) - $(LN) -s $(REAL_SO_NAME) $(LIBDIR)/$(SO_NAME) - $(LN) -s $(SO_NAME) $(LIBDIR)/$(LINKER_NAME) + $(LN) -s -f $(REAL_SO_NAME) $(LIBDIR)/$(SO_NAME) + $(LN) -s -f $(SO_NAME) $(LIBDIR)/$(LINKER_NAME) endif uninstall: diff --git a/deps/switchres/modeline.cpp b/deps/switchres/modeline.cpp index 35a19e31007..879d8c78198 100644 --- a/deps/switchres/modeline.cpp +++ b/deps/switchres/modeline.cpp @@ -168,9 +168,9 @@ int modeline_create(modeline *s_mode, modeline *t_mode, monitor_range *range, ge // if we can, let's apply the same scaling to both directions if (t_mode->type & X_RES_EDITABLE) { - x_scale = y_scale; + x_scale = cs->scale_proportional? y_scale : 1; double aspect_corrector = max(1.0f, cs->monitor_aspect / source_aspect); - t_mode->hactive = normalize(double(t_mode->hactive) * double(x_scale) * aspect_corrector, 8); + t_mode->hactive = normalize(double(t_mode->hactive) * double(x_scale) * aspect_corrector, cs->pixel_precision? 1 : 8); } // otherwise, try to get the best out of our current xres @@ -204,7 +204,7 @@ int modeline_create(modeline *s_mode, modeline *t_mode, monitor_range *range, ge // check if we can create a normal aspect resolution if (t_mode->type & X_RES_EDITABLE) - t_mode->hactive = max(t_mode->hactive, normalize(STANDARD_CRT_ASPECT * t_mode->vactive, 8)); + t_mode->hactive = max(t_mode->hactive, normalize(STANDARD_CRT_ASPECT * t_mode->vactive, cs->pixel_precision? 1 : 8)); // calculate integer scale for prescaling x_scale = max(1, scale_into_aspect(s_mode->hactive, t_mode->hactive, source_aspect, cs->monitor_aspect, &x_diff)); diff --git a/deps/switchres/modeline.h b/deps/switchres/modeline.h index ac71ddcfb1d..afa269c33e5 100644 --- a/deps/switchres/modeline.h +++ b/deps/switchres/modeline.h @@ -117,6 +117,7 @@ typedef struct generator_settings int v_shift_correct; int pixel_precision; int interlace_force_even; + int scale_proportional; } generator_settings; //============================================================ diff --git a/deps/switchres/switchres.cpp b/deps/switchres/switchres.cpp index 64736d848e9..5623117cdce 100644 --- a/deps/switchres/switchres.cpp +++ b/deps/switchres/switchres.cpp @@ -89,7 +89,7 @@ switchres_manager::switchres_manager() display()->set_monitor("generic_15"); display()->set_modeline("auto"); display()->set_lcd_range("auto"); - for (int i = 0; i++ < MAX_RANGES;) display()->set_crt_range(i, "auto"); + for (int i = 0; i < MAX_RANGES; i++) display()->set_crt_range(i, "auto"); display()->set_screen("auto"); display()->set_modeline_generation(true); display()->set_lock_unsupported_modes(true); @@ -109,6 +109,7 @@ switchres_manager::switchres_manager() display()->set_v_shift_correct(0); display()->set_pixel_precision(1); display()->set_interlace_force_even(0); + display()->set_scale_proportional(1); // Set logger properties set_log_info_fn((void*)printf); @@ -359,6 +360,10 @@ void switchres_manager::set_option(const char* key, const char* value) display()->set_interlace_force_even(atoi(value)); break; + case s2i("scale_proportional"): + display()->set_scale_proportional(atoi(value)); + break; + // Custom video backend options case s2i("screen_compositing"): display()->set_screen_compositing(atoi(value)); diff --git a/deps/switchres/switchres.h b/deps/switchres/switchres.h index d6af27e3cfa..80233b0498a 100644 --- a/deps/switchres/switchres.h +++ b/deps/switchres/switchres.h @@ -27,7 +27,7 @@ //============================================================ #ifndef SWITCHRES_VERSION -#define SWITCHRES_VERSION "2.1.0" +#define SWITCHRES_VERSION "2.2.1" #endif diff --git a/deps/switchres/switchres.ini b/deps/switchres/switchres.ini index 8c7b1ea3c7f..e191c161cc0 100644 --- a/deps/switchres/switchres.ini +++ b/deps/switchres/switchres.ini @@ -122,6 +122,9 @@ # Calculate all vertical values of interlaced modes as even numbers. Required by AMD APU hardware on Linux interlace_force_even 0 +# Scale both axes by the same factor, when integer scaling is applied + scale_proportional 1 + # # Custom video backend config diff --git a/deps/switchres/switchres_defines.h b/deps/switchres/switchres_defines.h index 9a9e96759d3..42470eda9bf 100644 --- a/deps/switchres/switchres_defines.h +++ b/deps/switchres/switchres_defines.h @@ -33,6 +33,7 @@ #define SR_OPT_V_SHIFT "v_shift" #define SR_OPT_PIXEL_PRECISION "pixel_precision" #define SR_OPT_INTERLACE_FORCE_EVEN "interlace_force_even" +#define SR_OPT_SCALE_PROPORTIONAL "scale_proportional" #define SR_OPT_SCREEN_COMPOSITING "screen_compositing" #define SR_OPT_SCREEN_REORDERING "screen_reordering" #define SR_OPT_ALLOW_HARDWARE_REFRESH "allow_hardware_refresh" diff --git a/deps/switchres/switchres_main.cpp b/deps/switchres/switchres_main.cpp index c793cbf1a08..ac16a94003d 100644 --- a/deps/switchres/switchres_main.cpp +++ b/deps/switchres/switchres_main.cpp @@ -16,6 +16,7 @@ #include #include #include "switchres.h" +#include "switchres_defines.h" #include "log.h" using namespace std; @@ -25,7 +26,42 @@ int show_usage(); enum { - OPT_MODELINE = 128 + OPT_CRT_RANGE0 = 128, + OPT_CRT_RANGE1, + OPT_CRT_RANGE2, + OPT_CRT_RANGE3, + OPT_CRT_RANGE4, + OPT_CRT_RANGE5, + OPT_CRT_RANGE6, + OPT_CRT_RANGE7, + OPT_CRT_RANGE8, + OPT_CRT_RANGE9, + OPT_LCD_RANGE, + OPT_MODELINE, + OPT_USER_MODE, + OPT_API, + OPT_LOCK_UNSUPPORTED_MODES, + OPT_LOCK_SYSTEM_MODES, + OPT_REFRESH_DONT_CARE, + OPT_KEEP_CHANGES, + OPT_MODELINE_GENERATION, + OPT_INTERLACE, + OPT_DOUBLESCAN, + OPT_DOTCLOCK_MIN, + OPT_SYNC_REFRESH_TOLERANCE, + OPT_SUPER_WIDTH, + OPT_V_SHIFT_CORRECT, + OPT_H_SIZE, + OPT_H_SHIFT, + OPT_V_SHIFT, + OPT_PIXEL_PRECISION, + OPT_INTERLACE_FORCE_EVEN, + OPT_SCALE_PROPORTIONAL, + OPT_SCREEN_COMPOSITING, + OPT_SCREEN_REORDERING, + OPT_ALLOW_HARDWARE_REFRESH, + OPT_CUSTOM_TIMING, + OPT_VERBOSITY }; //============================================================ @@ -68,28 +104,65 @@ int main(int argc, char **argv) { static struct option long_options[] = { + // Options unique to standalone Switchres {"version", no_argument, &version_flag, '1'}, {"help", no_argument, 0, 'h'}, {"calc", no_argument, 0, 'c'}, {"switch", no_argument, 0, 's'}, {"launch", required_argument, 0, 'l'}, - {"monitor", required_argument, 0, 'm'}, - {"aspect", required_argument, 0, 'a'}, {"edid", no_argument, 0, 'e'}, {"rotated", no_argument, 0, 'r'}, - {"display", required_argument, 0, 'd'}, - {"force", required_argument, 0, 'f'}, + {"force", required_argument, 0, 'f'}, // equ. --user_mode {"ini", required_argument, 0, 'i'}, - {"verbose", no_argument, 0, 'v'}, - {"backend", required_argument, 0, 'b'}, - {"keep", no_argument, 0, 'k'}, + {"keep", no_argument, 0, 'k'}, // equ. --keep_changes {"geometry", required_argument, 0, 'g'}, - {"modeline", required_argument, 0, OPT_MODELINE}, + // Options available in short and long forms + {SR_OPT_VERBOSE, no_argument, 0, 'v'}, + {SR_OPT_DISPLAY, required_argument, 0, 'd'}, + {SR_OPT_MONITOR, required_argument, 0, 'm'}, + {SR_OPT_ASPECT, required_argument, 0, 'a'}, + // Long options, from switchres.ini + {SR_OPT_CRT_RANGE0, required_argument, 0, OPT_CRT_RANGE0}, + {SR_OPT_CRT_RANGE1, required_argument, 0, OPT_CRT_RANGE1}, + {SR_OPT_CRT_RANGE2, required_argument, 0, OPT_CRT_RANGE2}, + {SR_OPT_CRT_RANGE3, required_argument, 0, OPT_CRT_RANGE3}, + {SR_OPT_CRT_RANGE4, required_argument, 0, OPT_CRT_RANGE4}, + {SR_OPT_CRT_RANGE5, required_argument, 0, OPT_CRT_RANGE5}, + {SR_OPT_CRT_RANGE6, required_argument, 0, OPT_CRT_RANGE6}, + {SR_OPT_CRT_RANGE7, required_argument, 0, OPT_CRT_RANGE7}, + {SR_OPT_CRT_RANGE8, required_argument, 0, OPT_CRT_RANGE8}, + {SR_OPT_CRT_RANGE9, required_argument, 0, OPT_CRT_RANGE9}, + {SR_OPT_LCD_RANGE, required_argument, 0, OPT_LCD_RANGE}, + {SR_OPT_MODELINE, required_argument, 0, OPT_MODELINE}, + {SR_OPT_USER_MODE, required_argument, 0, OPT_USER_MODE}, + {SR_OPT_API, required_argument, 0, OPT_API}, + {SR_OPT_LOCK_UNSUPPORTED_MODES, required_argument, 0, OPT_LOCK_UNSUPPORTED_MODES}, + {SR_OPT_LOCK_SYSTEM_MODES, required_argument, 0, OPT_LOCK_SYSTEM_MODES}, + {SR_OPT_REFRESH_DONT_CARE, required_argument, 0, OPT_REFRESH_DONT_CARE}, + {SR_OPT_KEEP_CHANGES, required_argument, 0, OPT_KEEP_CHANGES}, + {SR_OPT_MODELINE_GENERATION, required_argument, 0, OPT_MODELINE_GENERATION}, + {SR_OPT_INTERLACE, required_argument, 0, OPT_INTERLACE}, + {SR_OPT_DOUBLESCAN, required_argument, 0, OPT_DOUBLESCAN}, + {SR_OPT_DOTCLOCK_MIN, required_argument, 0, OPT_DOTCLOCK_MIN}, + {SR_OPT_SYNC_REFRESH_TOLERANCE, required_argument, 0, OPT_SYNC_REFRESH_TOLERANCE}, + {SR_OPT_SUPER_WIDTH, required_argument, 0, OPT_SUPER_WIDTH}, + {SR_OPT_V_SHIFT_CORRECT, required_argument, 0, OPT_V_SHIFT_CORRECT}, + {SR_OPT_H_SIZE, required_argument, 0, OPT_H_SIZE}, + {SR_OPT_H_SHIFT, required_argument, 0, OPT_H_SHIFT}, + {SR_OPT_V_SHIFT, required_argument, 0, OPT_V_SHIFT}, + {SR_OPT_PIXEL_PRECISION, required_argument, 0, OPT_PIXEL_PRECISION}, + {SR_OPT_INTERLACE_FORCE_EVEN, required_argument, 0, OPT_INTERLACE_FORCE_EVEN}, + {SR_OPT_SCALE_PROPORTIONAL, required_argument, 0, OPT_SCALE_PROPORTIONAL}, + {SR_OPT_SCREEN_COMPOSITING, required_argument, 0, OPT_SCREEN_COMPOSITING}, + {SR_OPT_SCREEN_REORDERING, required_argument, 0, OPT_SCREEN_REORDERING}, + {SR_OPT_ALLOW_HARDWARE_REFRESH, required_argument, 0, OPT_ALLOW_HARDWARE_REFRESH}, + {SR_OPT_CUSTOM_TIMING, required_argument, 0, OPT_CUSTOM_TIMING}, + {SR_OPT_VERBOSITY, required_argument, 0, OPT_VERBOSITY}, {0, 0, 0, 0} }; int option_index = 0; - int c = getopt_long(argc, argv, "vhcsl:m:a:erd:f:i:b:kg:", long_options, &option_index); + int c = getopt_long(argc, argv, "vhcsl:m:a:erd:f:i:kg:", long_options, &option_index); if (c == -1) break; @@ -102,10 +175,6 @@ int main(int argc, char **argv) switch (c) { - case OPT_MODELINE: - df->set_modeline(optarg); - break; - case 'v': switchres.set_log_level(3); switchres.set_log_error_fn((void*)printf); @@ -142,7 +211,8 @@ int main(int argc, char **argv) // Add new display in multi-monitor case if (index > 0) switchres.add_display(); index ++; - df->set_screen(optarg); + switchres.set_current_display(-1); + switchres.set_option(SR_OPT_DISPLAY, optarg); break; case 'a': @@ -154,9 +224,10 @@ int main(int argc, char **argv) break; case 'f': + case OPT_USER_MODE: force_flag = true; if (sscanf(optarg, "%dx%d@%d", &user_mode.width, &user_mode.height, &user_mode.refresh) < 1) - log_error("Error: use format --force x@\n"); + log_error("Error: use format x@\n"); break; case 'i': @@ -183,6 +254,45 @@ int main(int argc, char **argv) df->set_v_shift(v_shift); break; + // Long options + case OPT_CRT_RANGE0: + case OPT_CRT_RANGE1: + case OPT_CRT_RANGE2: + case OPT_CRT_RANGE3: + case OPT_CRT_RANGE4: + case OPT_CRT_RANGE5: + case OPT_CRT_RANGE6: + case OPT_CRT_RANGE7: + case OPT_CRT_RANGE8: + case OPT_CRT_RANGE9: + case OPT_LCD_RANGE: + case OPT_MODELINE: + case OPT_API: + case OPT_LOCK_UNSUPPORTED_MODES: + case OPT_LOCK_SYSTEM_MODES: + case OPT_REFRESH_DONT_CARE: + case OPT_KEEP_CHANGES: + case OPT_MODELINE_GENERATION: + case OPT_INTERLACE: + case OPT_DOUBLESCAN: + case OPT_DOTCLOCK_MIN: + case OPT_SYNC_REFRESH_TOLERANCE: + case OPT_SUPER_WIDTH: + case OPT_V_SHIFT_CORRECT: + case OPT_H_SIZE: + case OPT_H_SHIFT: + case OPT_V_SHIFT: + case OPT_PIXEL_PRECISION: + case OPT_INTERLACE_FORCE_EVEN: + case OPT_SCALE_PROPORTIONAL: + case OPT_SCREEN_COMPOSITING: + case OPT_SCREEN_REORDERING: + case OPT_ALLOW_HARDWARE_REFRESH: + case OPT_CUSTOM_TIMING: + case OPT_VERBOSITY: + switchres.set_option(long_options[option_index].name, optarg); + break; + default: return 0; } @@ -265,7 +375,7 @@ int main(int argc, char **argv) monitor_range *range = &switchres.display()->range[mode->range]; edid_from_modeline(mode, range, switchres.display()->monitor(), &edid); - char file_name[strlen(switchres.display()->monitor()) + 4]; + char file_name[strlen(switchres.display()->monitor()) + 5]; sprintf(file_name, "%s.bin", switchres.display()->monitor()); FILE *file = fopen(file_name, "wb"); @@ -313,7 +423,7 @@ int show_version() { "Switchres " SWITCHRES_VERSION "\n" "Modeline generation engine for emulation\n" - "Copyright (C) 2010-2021 - Chris Kennedy, Antonio Giner, Alexandre Wodarczyk, Gil Delescluse\n" + "Copyright (C) 2010-2024 - Chris Kennedy, Antonio Giner, Alexandre Wodarczyk, Gil Delescluse\n" "License GPL-2.0+\n" "This is free software: you are free to change and redistribute it.\n" "There is NO WARRANTY, to the extent permitted by law.\n" @@ -338,15 +448,17 @@ int show_usage() " -l, --launch Launch \n" " -m, --monitor Monitor preset (generic_15, arcade_15, pal, ntsc, etc.)\n" " -a, --aspect Monitor aspect ratio\n" - " -r, --rotated Original mode's native orientation is rotated\n" - " -d, --display Use target display (Windows: \\\\.\\DISPLAY1, ... Linux: VGA-0, ...)\n" + " -r, --rotated Rotate axes, preserving aspect ratio.\n" + " -d, --display Use target display (index = 0, 1, 2...)\n" " -f, --force x@ Force a specific video mode from display mode list\n" " -i, --ini Specify an ini file\n" - " -b, --backend Specify the api name\n" " -e, --edid Create an EDID binary with calculated video modes\n" " -k, --keep Keep changes on exit (warning: this disables cleanup)\n" - " -g, --geometry :: Adjust geometry of generated modeline\n" - " --modeline <\"pclk hdisp hsst hsend htot vdisp vsst vsend vtot flags\"> Force an XFree86 modeline\n" + " -g, --geometry Adjust geometry of generated modeline\n" + " adjustment = ::\n" + " e.g. switchres 640 480 60 -c -g 1.1:-1:2\n\n" + "For more options, refer to switchres.ini. All options in switchres.ini can be applied in\n" + "command line as long options, e.g.: switchres 256 224 57.55 -c --dotclock_min 8.0\n\n" }; log_info("%s", usage); diff --git a/file_path_special.c b/file_path_special.c index 91516971d2c..60bc7ac134e 100644 --- a/file_path_special.c +++ b/file_path_special.c @@ -263,7 +263,7 @@ void fill_pathname_application_special(char *s, else #endif #if defined(HAVE_MATERIALUI) || defined(HAVE_OZONE) - if ( string_is_equal(menu_ident, "glui") + if ( string_is_equal(menu_ident, "glui") || string_is_equal(menu_ident, "ozone")) { char s4[PATH_MAX_LENGTH]; @@ -283,8 +283,8 @@ void fill_pathname_application_special(char *s, case APPLICATION_SPECIAL_DIRECTORY_ASSETS_SYSICONS: { #ifdef HAVE_MENU - settings_t *settings = config_get_ptr(); #if defined(HAVE_XMB) || defined(HAVE_MATERIALUI) || defined(HAVE_OZONE) + settings_t *settings = config_get_ptr(); const char *menu_ident = settings->arrays.menu_driver; #endif @@ -321,8 +321,7 @@ void fill_pathname_application_special(char *s, } else #endif - if (len) - s[0] = '\0'; + if (len) s[0] = '\0'; #endif } diff --git a/gfx/common/d3d11_defines.h b/gfx/common/d3d11_defines.h index cf4dcca7b13..98035b21bc0 100644 --- a/gfx/common/d3d11_defines.h +++ b/gfx/common/d3d11_defines.h @@ -221,7 +221,7 @@ typedef struct uint32_t flags; d3d11_shader_t shaders[GFX_MAX_SHADERS]; #ifdef HAVE_DXGI_HDR - enum dxgi_swapchain_bit_depth + enum dxgi_swapchain_bit_depth chain_bit_depth; DXGI_COLOR_SPACE_TYPE chain_color_space; DXGI_FORMAT chain_formats[DXGI_SWAPCHAIN_BIT_DEPTH_COUNT]; diff --git a/gfx/common/d3d9_common.c b/gfx/common/d3d9_common.c index c1820fd2db6..d2203b2b147 100644 --- a/gfx/common/d3d9_common.c +++ b/gfx/common/d3d9_common.c @@ -30,6 +30,7 @@ #include #endif #include +#include #ifdef HAVE_THREADS #include "../video_thread_wrapper.h" @@ -1112,7 +1113,7 @@ void d3d9_set_menu_texture_frame(void *data, uint32_t *dst = (uint32_t*)d3dlr.pBits; const uint16_t *src = (const uint16_t*)frame; - for (h = 0; h < height; h++, + for (h = 0; h < height; h++, dst += d3dlr.Pitch >> 2, src += width) { @@ -1162,7 +1163,7 @@ static void d3d9_video_texture_load_d3d( if (!ti) return; - if ( (info->type == TEXTURE_FILTER_MIPMAP_LINEAR) + if ( (info->type == TEXTURE_FILTER_MIPMAP_LINEAR) || (info->type == TEXTURE_FILTER_MIPMAP_NEAREST)) want_mipmap = true; @@ -1219,7 +1220,7 @@ uintptr_t d3d9_load_texture(void *video_data, void *data, return id; } -void d3d9_unload_texture(void *data, +void d3d9_unload_texture(void *data, bool threaded, uintptr_t id) { LPDIRECT3DTEXTURE9 texid; diff --git a/gfx/common/vulkan_common.c b/gfx/common/vulkan_common.c index 5d13e16720a..2326c581cf8 100644 --- a/gfx/common/vulkan_common.c +++ b/gfx/common/vulkan_common.c @@ -862,7 +862,7 @@ static VkInstance vulkan_context_create_instance_wrapper(void *opaque, const VkI const char **instance_extensions = (const char**)malloc((info.enabledExtensionCount + 3 + ARRAY_SIZE(vulkan_optional_device_extensions)) * sizeof(const char *)); const char **instance_layers = (const char**)malloc((info.enabledLayerCount + 1) * sizeof(const char *)); - + const char *required_extensions[3]; uint32_t required_extension_count = 0; @@ -2629,3 +2629,305 @@ void vulkan_present(gfx_ctx_vulkan_data_t *vk, unsigned index) slock_unlock(vk->context.queue_lock); #endif } + +void vulkan_initialize_render_pass(VkDevice device, VkFormat format, + VkRenderPass *render_pass) +{ + VkAttachmentReference color_ref; + VkRenderPassCreateInfo rp_info; + VkAttachmentDescription attachment; + VkSubpassDescription subpass; + + rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; + rp_info.pNext = NULL; + rp_info.flags = 0; + rp_info.attachmentCount = 1; + rp_info.pAttachments = &attachment; + rp_info.subpassCount = 1; + rp_info.pSubpasses = &subpass; + rp_info.dependencyCount = 0; + rp_info.pDependencies = NULL; + + color_ref.attachment = 0; + color_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + /* We will always write to the entire framebuffer, + * so we don't really need to clear. */ + attachment.flags = 0; + attachment.format = format; + attachment.samples = VK_SAMPLE_COUNT_1_BIT; + attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; + attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; + attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; + attachment.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + + subpass.flags = 0; + subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; + subpass.inputAttachmentCount = 0; + subpass.pInputAttachments = NULL; + subpass.colorAttachmentCount = 1; + subpass.pColorAttachments = &color_ref; + subpass.pResolveAttachments = NULL; + subpass.pDepthStencilAttachment = NULL; + subpass.preserveAttachmentCount = 0; + subpass.pPreserveAttachments = NULL; + + vkCreateRenderPass(device, &rp_info, NULL, render_pass); +} + +void vulkan_framebuffer_clear(VkImage image, VkCommandBuffer cmd) +{ + VkClearColorValue color; + VkImageSubresourceRange range; + + VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED); + + color.float32[0] = 0.0f; + color.float32[1] = 0.0f; + color.float32[2] = 0.0f; + color.float32[3] = 0.0f; + range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + range.baseMipLevel = 0; + range.levelCount = 1; + range.baseArrayLayer = 0; + range.layerCount = 1; + + vkCmdClearColorImage(cmd, + image, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + &color, + 1, + &range); + + VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED); +} + +void vulkan_framebuffer_generate_mips( + VkFramebuffer framebuffer, + VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + unsigned levels + ) +{ + unsigned i; + /* This is run every frame, so make sure + * we aren't opting into the "lazy" way of doing this. :) */ + VkImageMemoryBarrier barriers[2]; + + /* First, transfer the input mip level to TRANSFER_SRC_OPTIMAL. + * This should allow the surface to stay compressed. + * All subsequent mip-layers are now transferred into DST_OPTIMAL from + * UNDEFINED at this point. + */ + + /* Input */ + barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barriers[0].pNext = NULL; + barriers[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; + barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + barriers[0].oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; + barriers[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barriers[0].image = image; + barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barriers[0].subresourceRange.baseMipLevel = 0; + barriers[0].subresourceRange.levelCount = 1; + barriers[0].subresourceRange.baseArrayLayer = 0; + barriers[0].subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + + /* The rest of the mip chain */ + barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; + barriers[1].pNext = NULL; + barriers[1].srcAccessMask = 0; + barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barriers[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; + barriers[1].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; + barriers[1].image = image; + barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + barriers[1].subresourceRange.baseMipLevel = 1; + barriers[1].subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; + barriers[1].subresourceRange.baseArrayLayer = 0; + barriers[1].subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; + + vkCmdPipelineBarrier(cmd, + VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + 0, + NULL, + 0, + NULL, + 2, + barriers); + + for (i = 1; i < levels; i++) + { + unsigned src_width, src_height, target_width, target_height; + VkImageBlit blit_region = {{0}}; + + /* For subsequent passes, we have to transition + * from DST_OPTIMAL to SRC_OPTIMAL, + * but only do so one mip-level at a time. */ + if (i > 1) + { + barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + barriers[0].subresourceRange.baseMipLevel = i - 1; + barriers[0].subresourceRange.levelCount = 1; + barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + barriers[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + + vkCmdPipelineBarrier(cmd, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + 0, + 0, + NULL, + 0, + NULL, + 1, + barriers); + } + + src_width = MAX(size.width >> (i - 1), 1u); + src_height = MAX(size.height >> (i - 1), 1u); + target_width = MAX(size.width >> i, 1u); + target_height = MAX(size.height >> i, 1u); + + blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + blit_region.srcSubresource.mipLevel = i - 1; + blit_region.srcSubresource.baseArrayLayer = 0; + blit_region.srcSubresource.layerCount = 1; + blit_region.dstSubresource = blit_region.srcSubresource; + blit_region.dstSubresource.mipLevel = i; + blit_region.srcOffsets[1].x = src_width; + blit_region.srcOffsets[1].y = src_height; + blit_region.srcOffsets[1].z = 1; + blit_region.dstOffsets[1].x = target_width; + blit_region.dstOffsets[1].y = target_height; + blit_region.dstOffsets[1].z = 1; + + vkCmdBlitImage(cmd, + image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, + image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, &blit_region, VK_FILTER_LINEAR); + } + + /* We are now done, and we have all mip-levels except + * the last in TRANSFER_SRC_OPTIMAL, + * and the last one still on TRANSFER_DST_OPTIMAL, + * so do a final barrier which + * moves everything to SHADER_READ_ONLY_OPTIMAL in + * one go along with the execution barrier to next pass. + * Read-to-read memory barrier, so only need execution + * barrier for first transition. + */ + barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; + barriers[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + barriers[0].subresourceRange.baseMipLevel = 0; + barriers[0].subresourceRange.levelCount = levels - 1; + barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; + barriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + /* This is read-after-write barrier. */ + barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; + barriers[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; + barriers[1].subresourceRange.baseMipLevel = levels - 1; + barriers[1].subresourceRange.levelCount = 1; + barriers[1].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; + barriers[1].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; + + vkCmdPipelineBarrier(cmd, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + 0, + 0, + NULL, + 0, + NULL, + 2, barriers); + + /* Next pass will wait for ALL_GRAPHICS_BIT, and since + * we have dstStage as FRAGMENT_SHADER, + * the dependency chain will ensure we don't start + * next pass until the mipchain is complete. */ +} + +void vulkan_framebuffer_copy(VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + VkImage src_image, VkImageLayout src_layout) +{ + VkImageCopy region; + + VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS( + cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_UNDEFINED, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 0, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED); + + region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; + region.srcSubresource.mipLevel = 0; + region.srcSubresource.baseArrayLayer = 0; + region.srcSubresource.layerCount = 1; + region.srcOffset.x = 0; + region.srcOffset.y = 0; + region.srcOffset.z = 0; + region.dstSubresource = region.srcSubresource; + region.dstOffset.x = 0; + region.dstOffset.y = 0; + region.dstOffset.z = 0; + region.extent.width = size.width; + region.extent.height = size.height; + region.extent.depth = 1; + + vkCmdCopyImage(cmd, + src_image, src_layout, + image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + 1, ®ion); + + VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, + image, + VK_REMAINING_MIP_LEVELS, + VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, + VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, + VK_ACCESS_TRANSFER_WRITE_BIT, + VK_ACCESS_SHADER_READ_BIT, + VK_PIPELINE_STAGE_TRANSFER_BIT, + VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, + VK_QUEUE_FAMILY_IGNORED, + VK_QUEUE_FAMILY_IGNORED); +} diff --git a/gfx/common/vulkan_common.h b/gfx/common/vulkan_common.h index 1681b723acd..42bbe1b282f 100644 --- a/gfx/common/vulkan_common.h +++ b/gfx/common/vulkan_common.h @@ -368,7 +368,7 @@ typedef struct vulkan_context VkFormat swapchain_format; #ifdef VULKAN_HDR_SWAPCHAIN VkColorSpaceKHR swapchain_colour_space; -#endif /* VULKAN_HDR_SWAPCHAIN */ +#endif /* VULKAN_HDR_SWAPCHAIN */ VkSemaphore swapchain_semaphores[VULKAN_MAX_SWAPCHAIN_IMAGES]; VkSemaphore swapchain_acquire_semaphore; @@ -577,6 +577,8 @@ typedef struct vk VkViewport vk_vp; VkRenderPass render_pass; struct video_viewport vp; + float translate_x; + float translate_y; struct vk_per_frame swapchain[VULKAN_MAX_SWAPCHAIN_IMAGES]; struct vk_image backbuffers[VULKAN_MAX_SWAPCHAIN_IMAGES]; struct vk_texture default_texture; @@ -737,6 +739,24 @@ void vulkan_debug_mark_memory(VkDevice device, VkDeviceMemory memory); bool vulkan_is_hdr10_format(VkFormat format); #endif /* VULKAN_HDR_SWAPCHAIN */ +void vulkan_initialize_render_pass(VkDevice device, VkFormat format, + VkRenderPass *render_pass); + +void vulkan_framebuffer_clear(VkImage image, VkCommandBuffer cmd); + +void vulkan_framebuffer_generate_mips( + VkFramebuffer framebuffer, + VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + unsigned levels + ); + +void vulkan_framebuffer_copy(VkImage image, + struct Size2D size, + VkCommandBuffer cmd, + VkImage src_image, VkImageLayout src_layout); + RETRO_END_DECLS #endif diff --git a/gfx/drivers/ctr_gfx.c b/gfx/drivers/ctr_gfx.c index 4c0b66da7ea..079478ad61f 100644 --- a/gfx/drivers/ctr_gfx.c +++ b/gfx/drivers/ctr_gfx.c @@ -1411,8 +1411,9 @@ static void ctr_render_bottom_screen(void *data) } } -// graphic function originates from here: -// https://github.com/smealum/3ds_hb_menu/blob/master/source/gfx.c +/* graphic function originates from here: + * https://github.com/smealum/3ds_hb_menu/blob/master/source/gfx.c + */ void ctr_fade_bottom_screen(gfxScreen_t screen, gfx3dSide_t side, u32 f) { #ifndef CONSOLE_LOG diff --git a/gfx/drivers/d3d10.c b/gfx/drivers/d3d10.c index f083cf92e71..8e721c944d9 100644 --- a/gfx/drivers/d3d10.c +++ b/gfx/drivers/d3d10.c @@ -2331,7 +2331,7 @@ static bool d3d10_gfx_frame( d3d10->pass[i].rotation = retroarch_get_rotation(); - /* Sub-frame info for multiframe shaders (per real content frame). + /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes */ if (!(d3d10->flags & D3D10_ST_FLAG_FRAME_DUPE_LOCK)) { @@ -2431,10 +2431,10 @@ static bool d3d10_gfx_frame( D3D10_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)d3d10->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)d3d10->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = d3d10->pass[i].viewport.Width ; - scissor_rect.bottom = (unsigned int)(((float)d3d10->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)d3d10->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); d3d10->device->lpVtbl->RSSetScissorRects(d3d10->device, 1, @@ -2452,7 +2452,7 @@ static bool d3d10_gfx_frame( d3d10->device->lpVtbl->RSSetScissorRects(d3d10->device, 1, &scissor_rect); } -#endif // D3D10_ROLLING_SCANLINE_SIMULATION +#endif /* D3D10_ROLLING_SCANLINE_SIMULATION */ context->lpVtbl->Draw(context, 4, 0); texture = &d3d10->pass[i].rt; @@ -2485,7 +2485,7 @@ static bool d3d10_gfx_frame( d3d10->clearcolor); context->lpVtbl->RSSetViewports(context, 1, &d3d10->frame.viewport); -#ifdef D3D10_ROLLING_SCANLINE_SIMULATION +#ifdef D3D10_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -2497,17 +2497,17 @@ static bool d3d10_gfx_frame( D3D10_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = video_width ; - scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); d3d10->device->lpVtbl->RSSetScissorRects(d3d10->device, 1, &scissor_rect); } else -#endif // D3D10_ROLLING_SCANLINE_SIMULATION +#endif /* D3D10_ROLLING_SCANLINE_SIMULATION */ { D3D10_RECT scissor_rect; @@ -2524,7 +2524,7 @@ static bool d3d10_gfx_frame( context->lpVtbl->OMSetBlendState(context, d3d10->blend_enable, NULL, D3D10_DEFAULT_SAMPLE_MASK); -#ifdef D3D10_ROLLING_SCANLINE_SIMULATION +#ifdef D3D10_ROLLING_SCANLINE_SIMULATION { D3D10_RECT scissor_rect; @@ -2536,7 +2536,7 @@ static bool d3d10_gfx_frame( d3d10->device->lpVtbl->RSSetScissorRects(d3d10->device, 1, &scissor_rect); } -#endif // D3D10_ROLLING_SCANLINE_SIMULATION +#endif /* D3D10_ROLLING_SCANLINE_SIMULATION */ if ( (d3d10->flags & D3D10_ST_FLAG_MENU_ENABLE) && d3d10->menu.texture.handle) @@ -2680,7 +2680,7 @@ static bool d3d10_gfx_frame( context->lpVtbl->ClearRenderTargetView(context, d3d10->renderTargetView, d3d10->clearcolor); DXGIPresent(d3d10->swapChain, d3d10->swap_interval, 0); } - } + } } /* Frame duping for Shader Subframes, don't combine with swap_interval > 1, BFI. @@ -2696,12 +2696,12 @@ static bool d3d10_gfx_frame( && (!(d3d10->flags & D3D10_ST_FLAG_FRAME_DUPE_LOCK))) { d3d10->flags |= D3D10_ST_FLAG_FRAME_DUPE_LOCK; - + for (k = 1; k < video_info->shader_subframes; k++) { -#ifdef D3D10_ROLLING_SCANLINE_SIMULATION +#ifdef D3D10_ROLLING_SCANLINE_SIMULATION video_info->current_subframe = k; -#endif // D3D10_ROLLING_SCANLINE_SIMULATION +#endif /* D3D10_ROLLING_SCANLINE_SIMULATION */ if (d3d10->shader_preset) for (m = 0; m < d3d10->shader_preset->passes; m++) diff --git a/gfx/drivers/d3d11.c b/gfx/drivers/d3d11.c index f7e942178a0..5209152dc5d 100644 --- a/gfx/drivers/d3d11.c +++ b/gfx/drivers/d3d11.c @@ -1000,6 +1000,7 @@ static uint32_t d3d11_get_flags(void *data) BIT32_SET(flags, GFX_CTX_FLAGS_MENU_FRAME_FILTERING); BIT32_SET(flags, GFX_CTX_FLAGS_OVERLAY_BEHIND_MENU_SUPPORTED); BIT32_SET(flags, GFX_CTX_FLAGS_BLACK_FRAME_INSERTION); + BIT32_SET(flags, GFX_CTX_FLAGS_SCREENSHOTS_SUPPORTED); #if defined(HAVE_SLANG) && defined(HAVE_SPIRV_CROSS) BIT32_SET(flags, GFX_CTX_FLAGS_SHADERS_SLANG); BIT32_SET(flags, GFX_CTX_FLAGS_SUBFRAME_SHADERS); @@ -3027,7 +3028,7 @@ static bool d3d11_gfx_frame( context, width, height, pitch, d3d11->format, frame, &d3d11->frame.texture[0]); } -#ifdef D3D11_ROLLING_SCANLINE_SIMULATION +#ifdef D3D11_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -3035,14 +3036,12 @@ static bool d3d11_gfx_frame( && !runloop_is_slowmotion && !runloop_is_paused && (!(d3d11->flags & D3D11_ST_FLAG_MENU_ENABLE))) - { context->lpVtbl->RSSetState(context, d3d11->scissor_enabled); - } else -#endif // D3D11_ROLLING_SCANLINE_SIMULATION +#endif /* D3D11_ROLLING_SCANLINE_SIMULATION */ { context->lpVtbl->RSSetState(context, d3d11->scissor_disabled); - } + } d3d11->context->lpVtbl->OMSetBlendState( d3d11->context, d3d11->blend_disable, @@ -3095,7 +3094,7 @@ static bool d3d11_gfx_frame( d3d11->pass[i].rotation = retroarch_get_rotation(); - /* Sub-frame info for multiframe shaders (per real content frame). + /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes */ if (!(d3d11->flags & D3D11_ST_FLAG_FRAME_DUPE_LOCK)) { @@ -3176,7 +3175,7 @@ static bool d3d11_gfx_frame( &d3d11->pass[i].rt.rt_view, NULL); context->lpVtbl->RSSetViewports(context, 1, &d3d11->pass[i].viewport); -#ifdef D3D11_ROLLING_SCANLINE_SIMULATION +#ifdef D3D11_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -3188,10 +3187,10 @@ static bool d3d11_gfx_frame( D3D11_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)d3d11->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)d3d11->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = d3d11->pass[i].viewport.Width ; - scissor_rect.bottom = (unsigned int)(((float)d3d11->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)d3d11->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); d3d11->context->lpVtbl->RSSetScissorRects(d3d11->context, 1, @@ -3209,7 +3208,7 @@ static bool d3d11_gfx_frame( d3d11->context->lpVtbl->RSSetScissorRects(d3d11->context, 1, &scissor_rect); } -#endif // D3D11_ROLLING_SCANLINE_SIMULATION +#endif /* D3D11_ROLLING_SCANLINE_SIMULATION */ if (i == d3d11->shader_preset->passes - 1) context->lpVtbl->Draw(context, 4, 0); @@ -3257,7 +3256,7 @@ static bool d3d11_gfx_frame( context->lpVtbl->VSSetConstantBuffers(context, 0, 1, &d3d11->frame.ubo); } -#ifdef D3D11_ROLLING_SCANLINE_SIMULATION +#ifdef D3D11_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -3269,20 +3268,18 @@ static bool d3d11_gfx_frame( D3D11_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = video_width ; - scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); d3d11->context->lpVtbl->RSSetScissorRects(d3d11->context, 1, &scissor_rect); } else - { d3d11->context->lpVtbl->RSSetScissorRects(d3d11->context, 1, &d3d11->scissor); - } -#endif // D3D11_ROLLING_SCANLINE_SIMULATION +#endif /* D3D11_ROLLING_SCANLINE_SIMULATION */ context->lpVtbl->Draw(context, 4, 0); context->lpVtbl->RSSetState(context, d3d11->scissor_enabled); @@ -3520,7 +3517,7 @@ static bool d3d11_gfx_frame( context->lpVtbl->ClearRenderTargetView(context, rtv, d3d11->clearcolor); DXGIPresent(d3d11->swapChain, d3d11->swap_interval, present_flags); } - } + } } /* Frame duping for Shader Subframes, don't combine with swap_interval > 1, BFI. @@ -3538,9 +3535,9 @@ static bool d3d11_gfx_frame( d3d11->flags |= D3D11_ST_FLAG_FRAME_DUPE_LOCK; for (k = 1; k < video_info->shader_subframes; k++) { -#ifdef D3D11_ROLLING_SCANLINE_SIMULATION +#ifdef D3D11_ROLLING_SCANLINE_SIMULATION video_info->current_subframe = k; -#endif // D3D11_ROLLING_SCANLINE_SIMULATION +#endif /* D3D11_ROLLING_SCANLINE_SIMULATION */ if (d3d11->shader_preset) for (m = 0; m < d3d11->shader_preset->passes; m++) @@ -3626,6 +3623,108 @@ static void d3d11_gfx_viewport_info(void* data, struct video_viewport* vp) *vp = d3d11->vp; } +static bool d3d11_gfx_read_viewport(void* data, uint8_t* buffer, bool is_idle) +{ + d3d11_video_t* d3d11 = (d3d11_video_t*)data; + ID3D11Texture2D* BackBuffer; + DXGISwapChain m_SwapChain; + ID3D11Texture2D* BackBufferStagingTexture; + ID3D11Resource* BackBufferStaging = NULL; + ID3D11Resource* BackBufferResource = NULL; + D3D11_TEXTURE2D_DESC StagingDesc; + D3D11_MAPPED_SUBRESOURCE Map; + const uint8_t* BackBufferData; + uint8_t* bufferRow; + uint32_t y; + uint32_t x; + bool ret; + + if (!d3d11) + return false; + + /*This implementation produces wrong result when using HDR*/ +#ifdef HAVE_DXGI_HDR + if ((d3d11->flags & D3D11_ST_FLAG_HDR_ENABLE)) + { + RARCH_ERR("[D3D11]: HDR screenshot not supported.\n"); + return false; + } +#endif + + /* Get the back buffer. */ + m_SwapChain = d3d11->swapChain; +#ifdef __cplusplus + m_SwapChain->lpVtbl->GetBuffer(m_SwapChain, 0, IID_ID3D11Texture2D, (void**)(&BackBuffer)); +#else + m_SwapChain->lpVtbl->GetBuffer(m_SwapChain, 0, &IID_ID3D11Texture2D, (void*)(&BackBuffer)); +#endif + + if (!BackBuffer) + return false; + + if (!is_idle) + { + video_driver_cached_frame(); + } + + /* Set the staging desc. */ + BackBuffer->lpVtbl->GetDesc(BackBuffer, &StagingDesc); + StagingDesc.Usage = D3D11_USAGE_STAGING; + StagingDesc.BindFlags = 0; + StagingDesc.CPUAccessFlags = D3D11_CPU_ACCESS_READ; + + /* Create the back buffer staging texture. */ + d3d11->device->lpVtbl->CreateTexture2D(d3d11->device, &StagingDesc, NULL, &BackBufferStagingTexture); + +#ifdef __cplusplus + BackBufferStagingTexture->lpVtbl->QueryInterface(BackBufferStagingTexture, IID_ID3D11Resource, (void**)&BackBufferStaging); + BackBuffer->lpVtbl->QueryInterface(BackBuffer, IID_ID3D11Resource, (void**)&BackBufferResource); +#else + BackBufferStagingTexture->lpVtbl->QueryInterface(BackBufferStagingTexture, &IID_ID3D11Resource, (void**)&BackBufferStaging); + BackBuffer->lpVtbl->QueryInterface(BackBuffer, &IID_ID3D11Resource, (void**)&BackBufferResource); +#endif + + /* Copy back buffer to back buffer staging. */ + d3d11->context->lpVtbl->CopyResource(d3d11->context, BackBufferStaging, BackBufferResource); + + /* Create the image. */ + d3d11->context->lpVtbl->Map(d3d11->context, BackBufferStaging, 0, D3D11_MAP_READ, 0, &Map); + BackBufferData = (const uint8_t*)Map.pData; + + /* Assuming format is DXGI_FORMAT_R8G8B8A8_UNORM */ + if (StagingDesc.Format == DXGI_FORMAT_R8G8B8A8_UNORM) + { + BackBufferData += Map.RowPitch * d3d11->vp.y; + for (y = 0; y < d3d11->vp.height; y++, BackBufferData += Map.RowPitch) + { + bufferRow = buffer + 3 * (d3d11->vp.height - y - 1) * d3d11->vp.width; + + for (x = 0; x < d3d11->vp.width; x++) + { + bufferRow[3 * x + 2] = BackBufferData[4 * (x + d3d11->vp.x) + 0]; + bufferRow[3 * x + 1] = BackBufferData[4 * (x + d3d11->vp.x) + 1]; + bufferRow[3 * x + 0] = BackBufferData[4 * (x + d3d11->vp.x) + 2]; + } + } + ret = true; + } + else + { + RARCH_ERR("[D3D11]: Unexpected swapchain format.\n"); + ret = false; + } + + d3d11->context->lpVtbl->Unmap(d3d11->context, BackBufferStaging, 0); + + /* Release the backbuffer staging. */ + BackBufferStaging->lpVtbl->Release(BackBufferStaging); + BackBufferResource->lpVtbl->Release(BackBufferResource); + BackBufferStagingTexture->lpVtbl->Release(BackBufferStagingTexture); + BackBuffer->lpVtbl->Release(BackBuffer); + + return ret; +} + static void d3d11_set_menu_texture_frame( void* data, const void* frame, bool rgb32, unsigned width, unsigned height, float alpha) @@ -3858,7 +3957,7 @@ video_driver_t video_d3d11 = { NULL, /* set_viewport */ d3d11_gfx_set_rotation, d3d11_gfx_viewport_info, - NULL, /* read_viewport */ + d3d11_gfx_read_viewport, NULL, /* read_frame_raw */ #ifdef HAVE_OVERLAY d3d11_get_overlay_interface, diff --git a/gfx/drivers/d3d12.c b/gfx/drivers/d3d12.c index c91b232077f..fbad25c4cb5 100644 --- a/gfx/drivers/d3d12.c +++ b/gfx/drivers/d3d12.c @@ -3204,7 +3204,7 @@ static void dx12_inject_black_frame(d3d12_video_t* d3d12) d3d12->queue.allocator->lpVtbl->Reset(d3d12->queue.allocator); cmd->lpVtbl->Reset(cmd, d3d12->queue.allocator, - d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]); + d3d12->pipes[VIDEO_SHADER_STOCK_BLEND]); d3d12->chain.frame_index = DXGIGetCurrentBackBufferIndex( d3d12->chain.handle); @@ -3595,7 +3595,7 @@ static bool d3d12_gfx_frame( d3d12->pass[i].rotation = retroarch_get_rotation(); - /* Sub-frame info for multiframe shaders (per real content frame). + /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes */ if (!(d3d12->flags & D3D12_ST_FLAG_FRAME_DUPE_LOCK)) { @@ -3751,7 +3751,7 @@ static bool d3d12_gfx_frame( cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->pass[i].viewport); -#ifdef D3D12_ROLLING_SCANLINE_SIMULATION +#ifdef D3D12_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -3763,20 +3763,20 @@ static bool d3d12_gfx_frame( D3D12_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)d3d12->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)d3d12->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = d3d12->pass[i].viewport.Width; - scissor_rect.bottom = (unsigned int)(((float)d3d12->pass[i].viewport.Height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)d3d12->pass[i].viewport.Height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); cmd->lpVtbl->RSSetScissorRects(cmd, 1, &scissor_rect); } else -#endif // D3D12_ROLLING_SCANLINE_SIMULATION +#endif /* D3D12_ROLLING_SCANLINE_SIMULATION */ { - cmd->lpVtbl->RSSetScissorRects(cmd, 1, + cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->pass[i].scissorRect); - } + } if (i == d3d12->shader_preset->passes - 1) start_vertex_location = 0; @@ -3864,7 +3864,7 @@ static bool d3d12_gfx_frame( cmd->lpVtbl->RSSetViewports(cmd, 1, &d3d12->frame.viewport); -#ifdef D3D12_ROLLING_SCANLINE_SIMULATION +#ifdef D3D12_ROLLING_SCANLINE_SIMULATION if ( (video_info->shader_subframes > 1) && (video_info->scan_subframes) && !black_frame_insertion @@ -3876,19 +3876,19 @@ static bool d3d12_gfx_frame( D3D12_RECT scissor_rect; scissor_rect.left = 0; - scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.top = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)video_info->current_subframe); scissor_rect.right = video_width ; - scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) + scissor_rect.bottom = (unsigned int)(((float)video_height / (float)video_info->shader_subframes) * (float)(video_info->current_subframe + 1)); cmd->lpVtbl->RSSetScissorRects(cmd, 1, &scissor_rect); } else -#endif // D3D12_ROLLING_SCANLINE_SIMULATION +#endif /* D3D12_ROLLING_SCANLINE_SIMULATION */ { cmd->lpVtbl->RSSetScissorRects(cmd, 1, &d3d12->frame.scissorRect); - } + } cmd->lpVtbl->DrawInstanced(cmd, 4, 1, 0, 0); @@ -4098,9 +4098,9 @@ static bool d3d12_gfx_frame( d3d12->flags |= D3D12_ST_FLAG_FRAME_DUPE_LOCK; for (k = 1; k < video_info->shader_subframes; k++) { -#ifdef D3D12_ROLLING_SCANLINE_SIMULATION +#ifdef D3D12_ROLLING_SCANLINE_SIMULATION video_info->current_subframe = k; -#endif // D3D12_ROLLING_SCANLINE_SIMULATION +#endif /* D3D12_ROLLING_SCANLINE_SIMULATION */ if (d3d12->shader_preset) for (m = 0; m < d3d12->shader_preset->passes; m++) diff --git a/gfx/drivers/gl2.c b/gfx/drivers/gl2.c index 3ed52ccc8f8..135cdfb7300 100644 --- a/gfx/drivers/gl2.c +++ b/gfx/drivers/gl2.c @@ -1274,7 +1274,7 @@ static void gl2_set_viewport(gl2_t *gl, { settings_t *settings = config_get_ptr(); float device_aspect = (float) viewport_width / (float)viewport_height; - + if (gl->ctx_driver->translate_aspect) device_aspect = gl->ctx_driver->translate_aspect( gl->ctx_data, viewport_width, viewport_height); @@ -3379,8 +3379,6 @@ static bool gl2_frame(void *data, const void *frame, bool use_rgba = (video_info->video_st_flags & VIDEO_FLAG_USE_RGBA) ? true : false; bool statistics_show = video_info->statistics_show; bool msg_bgcolor_enable = video_info->msg_bgcolor_enable; - int bfi_light_frames; - unsigned n; bool input_driver_nonblock_state = video_info->input_driver_nonblock_state; bool hard_sync = video_info->hard_sync; unsigned hard_sync_frames = video_info->hard_sync_frames; @@ -3666,6 +3664,8 @@ static bool gl2_frame(void *data, const void *frame, && !video_info->runloop_is_paused && !(gl->flags & GL2_FLAG_MENU_TEXTURE_ENABLE)) { + unsigned n; + int bfi_light_frames; if (video_info->bfi_dark_frames > video_info->black_frame_insertion) video_info->bfi_dark_frames = video_info->black_frame_insertion; @@ -4634,8 +4634,8 @@ static bool gl2_alive(void *data) #ifdef __WINRT__ if (is_running_on_xbox()) { - //match the output res to the display res - temp_width = uwp_get_width(); + /* Match the output res to the display resolution */ + temp_width = uwp_get_width(); temp_height = uwp_get_height(); } #endif diff --git a/gfx/drivers/gl3.c b/gfx/drivers/gl3.c index 1c9706c0092..1adb7530a4d 100644 --- a/gfx/drivers/gl3.c +++ b/gfx/drivers/gl3.c @@ -94,6 +94,195 @@ static void gl3_set_viewport(gl3_t *gl, * GL3 COMMON */ +void gl3_framebuffer_copy( + GLuint fb_id, + GLuint quad_program, + GLuint quad_vbo, + GLint flat_ubo_vertex, + struct Size2D size, + GLuint image) +{ + glBindFramebuffer(GL_FRAMEBUFFER, fb_id); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, image); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glViewport(0, 0, size.width, size.height); + glClear(GL_COLOR_BUFFER_BIT); + + glUseProgram(quad_program); + if (flat_ubo_vertex >= 0) + { + static float mvp[16] = { + 2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 2.0f, 0.0f, + -1.0f,-1.0f, 0.0f, 1.0f + }; + glUniform4fv(flat_ubo_vertex, 4, mvp); + } + + /* Draw quad */ + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + (void *)((uintptr_t)(0))); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + (void *)((uintptr_t)(2 * sizeof(float)))); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + + glUseProgram(0); + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +void gl3_framebuffer_copy_partial( + GLuint fb_id, + GLuint quad_program, + GLint flat_ubo_vertex, + struct Size2D size, + GLuint image, + float rx, float ry) +{ + GLuint vbo; + const float quad_data[16] = { + 0.0f, 0.0f, 0.0f, 0.0f, + 1.0f, 0.0f, rx, 0.0f, + 0.0f, 1.0f, 0.0f, ry, + 1.0f, 1.0f, rx, ry, + }; + + glBindFramebuffer(GL_FRAMEBUFFER, fb_id); + glActiveTexture(GL_TEXTURE2); + glBindTexture(GL_TEXTURE_2D, image); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); + glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); + glViewport(0, 0, size.width, size.height); + glClear(GL_COLOR_BUFFER_BIT); + + glUseProgram(quad_program); + if (flat_ubo_vertex >= 0) + { + static float mvp[16] = { + 2.0f, 0.0f, 0.0f, 0.0f, + 0.0f, 2.0f, 0.0f, 0.0f, + 0.0f, 0.0f, 2.0f, 0.0f, + -1.0f,-1.0f, 0.0f, 1.0f + }; + glUniform4fv(flat_ubo_vertex, 4, mvp); + } + glDisable(GL_CULL_FACE); + glDisable(GL_BLEND); + glDisable(GL_DEPTH_TEST); + glEnableVertexAttribArray(0); + glEnableVertexAttribArray(1); + + /* A bit crude, but heeeey. */ + glGenBuffers(1, &vbo); + glBindBuffer(GL_ARRAY_BUFFER, vbo); + + glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STREAM_DRAW); + glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + (void *)((uintptr_t)(0))); + glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), + (void *)((uintptr_t)(2 * sizeof(float)))); + glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); + glBindBuffer(GL_ARRAY_BUFFER, 0); + glDeleteBuffers(1, &vbo); + glDisableVertexAttribArray(0); + glDisableVertexAttribArray(1); + glUseProgram(0); + glBindTexture(GL_TEXTURE_2D, 0); + glBindFramebuffer(GL_FRAMEBUFFER, 0); +} + +GLuint gl3_compile_shader(GLenum stage, const char *source) +{ + GLint status; + GLuint shader = glCreateShader(stage); + const char *ptr = source; + + glShaderSource(shader, 1, &ptr, NULL); + glCompileShader(shader); + + glGetShaderiv(shader, GL_COMPILE_STATUS, &status); + + if (!status) + { + GLint length; + glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); + if (length > 0) + { + char *info_log = (char*)malloc(length); + + if (info_log) + { + glGetShaderInfoLog(shader, length, &length, info_log); + RARCH_ERR("[GLCore]: Failed to compile shader: %s\n", info_log); + free(info_log); + glDeleteShader(shader); + return 0; + } + } + } + + return shader; +} + +uint32_t gl3_get_cross_compiler_target_version(void) +{ + const char *version = (const char*)glGetString(GL_VERSION); + unsigned major = 0; + unsigned minor = 0; + +#ifdef HAVE_OPENGLES3 + if (!version || sscanf(version, "OpenGL ES %u.%u", &major, &minor) != 2) + return 300; + + if (major == 2 && minor == 0) + return 100; +#else + if (!version || sscanf(version, "%u.%u", &major, &minor) != 2) + return 150; + + if (major == 3) + { + switch (minor) + { + case 2: + return 150; + case 1: + return 140; + case 0: + return 130; + } + } + else if (major == 2) + { + switch (minor) + { + case 1: + return 120; + case 0: + return 110; + } + } +#endif + + return 100 * major + 10 * minor; +} + static void gl3_bind_scratch_vbo(gl3_t *gl, const void *data, size_t size) { if (!gl->scratch_vbos[gl->scratch_vbo_index]) @@ -2159,8 +2348,11 @@ static bool gl3_alive(void *data) #ifdef __WINRT__ if (is_running_on_xbox()) { - //we can set it to 1920x1080 as xbox uwp windowsize is guaranteed to be 1920x1080 and currently there is now way to set angle to use a variable resolution swapchain so regardless of the size the window is always 1080p - temp_width = 1920; + /* We can set it to 1920x1080 as xbox uwp windowsize is guaranteed + * to be 1920x1080 and currently there is now way to set ANGLE to + * use a variable resolution swapchain so regardless of the size + * the window is always 1080p */ + temp_width = 1920; temp_height = 1080; } #endif @@ -2581,16 +2773,12 @@ static bool gl3_frame(void *data, const void *frame, && !video_info->runloop_is_slowmotion && !video_info->runloop_is_paused && (!(gl->flags & GL3_FLAG_MENU_TEXTURE_ENABLE))) - { gl3_filter_chain_set_simulate_scanline( gl->filter_chain, true); - } else - { gl3_filter_chain_set_simulate_scanline( gl->filter_chain, false); - } -#endif // GL3_ROLLING_SCANLINE_SIMULATION +#endif /* GL3_ROLLING_SCANLINE_SIMULATION */ gl3_filter_chain_set_input_texture(gl->filter_chain, &texture); gl3_filter_chain_build_offscreen_passes(gl->filter_chain, diff --git a/gfx/drivers/gx_gfx.c b/gfx/drivers/gx_gfx.c index c82b5891556..da7fce023eb 100644 --- a/gfx/drivers/gx_gfx.c +++ b/gfx/drivers/gx_gfx.c @@ -990,7 +990,6 @@ static void gx_resize(gx_video_t *gx, float top = 1, bottom = -1, left = -1, right = 1; int x = 0, y = 0; const global_t *global = global_get_ptr(); - settings_t *settings = config_get_ptr(); unsigned width = gx->vp.full_width; unsigned height = gx->vp.full_height; @@ -1024,9 +1023,9 @@ static void gx_resize(gx_video_t *gx, || (gx->orientation == ORIENTATION_FLIPPED_ROTATED)) desired_aspect = 1.0 / desired_aspect; video_viewport_get_scaled_aspect2(&gx->vp, width, height, true, device_aspect, desired_aspect); - x = gx->vp.x; - y = gx->vp.y; - width = gx->vp.width; + x = gx->vp.x; + y = gx->vp.y; + width = gx->vp.width; height = gx->vp.height; } diff --git a/gfx/drivers/rsx_gfx.c b/gfx/drivers/rsx_gfx.c index 793e5328382..27f37d59449 100644 --- a/gfx/drivers/rsx_gfx.c +++ b/gfx/drivers/rsx_gfx.c @@ -983,14 +983,10 @@ static void rsx_set_viewport(void *data, unsigned viewport_width, { int i; rsx_viewport_t vp; - int x = 0; - int y = 0; - float device_aspect = (float)viewport_width / viewport_height; struct video_ortho ortho = {0, 1, 0, 1, -1, 1}; settings_t *settings = config_get_ptr(); rsx_t *rsx = (rsx_t*)data; bool video_scale_integer = settings->bools.video_scale_integer; - unsigned aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; if (video_scale_integer && !force_full) { diff --git a/gfx/drivers/switch_nx_gfx.c b/gfx/drivers/switch_nx_gfx.c index c679c7ebabe..eb4db8bee74 100644 --- a/gfx/drivers/switch_nx_gfx.c +++ b/gfx/drivers/switch_nx_gfx.c @@ -549,20 +549,18 @@ static void switch_update_viewport(switch_video_t *sw, video_frame_info_t *video_info) { settings_t *settings = config_get_ptr(); - int x = 0; - int y = 0; float desired_aspect = 0.0f; float width = sw->vp.full_width; float height = sw->vp.full_height; if (sw->o_size) { - width = sw->o_width; - height = sw->o_height; - sw->vp.x = (int)(((float)sw->vp.full_width - width)) / 2; - sw->vp.y = (int)(((float)sw->vp.full_height - height)) / 2; + width = sw->o_width; + height = sw->o_height; + sw->vp.x = (int)(((float)sw->vp.full_width - width)) / 2; + sw->vp.y = (int)(((float)sw->vp.full_height - height)) / 2; - sw->vp.width = width; + sw->vp.width = width; sw->vp.height = height; return; @@ -570,19 +568,16 @@ static void switch_update_viewport(switch_video_t *sw, desired_aspect = video_driver_get_aspect_ratio(); + /* TODO/FIXME: Does nx use top-left or bottom-left origin? I'm assuming top left. */ if (settings->bools.video_scale_integer) - { - /* TODO: Does nx use top-left or bottom-left origin? I'm assuming top left. */ - video_viewport_get_scaled_integer(&sw->vp, sw->vp.full_width, sw->vp.full_height, desired_aspect, sw->keep_aspect, true); - } + video_viewport_get_scaled_integer(&sw->vp, sw->vp.full_width, sw->vp.full_height, + desired_aspect, sw->keep_aspect, true); else if (sw->keep_aspect) - { - video_viewport_get_scaled_aspect(&sw->vp, width, height, true); - } + video_viewport_get_scaled_aspect(&sw->vp, width, height, true); else { - sw->vp.x = sw->vp.y = 0; - sw->vp.width = width; + sw->vp.x = sw->vp.y = 0; + sw->vp.width = width; sw->vp.height = height; } } @@ -648,9 +643,9 @@ static bool switch_frame(void *data, const void *frame, return true; } - if ( sw->should_resize || - width != sw->last_width || - height != sw->last_height) + if ( sw->should_resize + || (width != sw->last_width) + || (height != sw->last_height)) { switch_update_viewport(sw, video_info); @@ -669,21 +664,21 @@ static bool switch_frame(void *data, const void *frame, if (!sw->smooth) { - sw->scaler.out_width = sw->vp.width; + sw->scaler.out_width = sw->vp.width; sw->scaler.out_height = sw->vp.height; sw->scaler.out_stride = sw->vp.full_width * sizeof(uint32_t); } else { - sw->scaler.out_width = width; + sw->scaler.out_width = width; sw->scaler.out_height = height; sw->scaler.out_stride = width * sizeof(uint32_t); - float screen_ratio = (float)sw->vp.full_width / sw->vp.full_height; - float tgt_ratio = (float)sw->vp.width / sw->vp.height; + float screen_ratio = (float)sw->vp.full_width / sw->vp.full_height; + float tgt_ratio = (float)sw->vp.width / sw->vp.height; - sw->hw_scale.width = ceil(screen_ratio / tgt_ratio * sw->scaler.out_width); - sw->hw_scale.height = sw->scaler.out_height; + sw->hw_scale.width = ceil(screen_ratio / tgt_ratio * sw->scaler.out_width); + sw->hw_scale.height = sw->scaler.out_height; sw->hw_scale.x_offset = ceil((sw->hw_scale.width - sw->scaler.out_width) / 2.0); #ifdef HAVE_MENU if (!menu_is_alive) @@ -693,20 +688,20 @@ static bool switch_frame(void *data, const void *frame, nwindowSetDimensions(sw->win, sw->hw_scale.width, sw->hw_scale.height); } } - sw->scaler.out_fmt = SCALER_FMT_ABGR8888; + sw->scaler.out_fmt = SCALER_FMT_ABGR8888; sw->scaler.scaler_type = SCALER_TYPE_POINT; if (!scaler_ctx_gen_filter(&sw->scaler)) return false; - sw->last_width = width; - sw->last_height = height; + sw->last_width = width; + sw->last_height = height; - sw->should_resize = false; + sw->should_resize = false; } - out_buffer = (uint32_t *)framebufferBegin(&sw->fb, &stride); + out_buffer = (uint32_t*)framebufferBegin(&sw->fb, &stride); sw->out_buffer = out_buffer; sw->stride = stride; @@ -726,7 +721,10 @@ static bool switch_frame(void *data, const void *frame, if (sw->menu_texture.pixels) { memset(out_buffer, 0, stride * sw->vp.full_height); - scaler_ctx_scale(&sw->menu_texture.scaler, sw->tmp_image + ((sw->vp.full_height - sw->menu_texture.tgth) / 2) * sw->vp.full_width + ((sw->vp.full_width - sw->menu_texture.tgtw) / 2), sw->menu_texture.pixels); + scaler_ctx_scale(&sw->menu_texture.scaler, + sw->tmp_image + ((sw->vp.full_height - sw->menu_texture.tgth) / 2) + * sw->vp.full_width + ((sw->vp.full_width - sw->menu_texture.tgtw) / 2), + sw->menu_texture.pixels); gfx_cpy_dsp_buf(out_buffer, sw->tmp_image, sw->vp.full_width, sw->vp.full_height, stride, true); } } @@ -821,9 +819,9 @@ static void switch_set_texture_frame( switch_video_t *sw = data; size_t sz = width * height * (rgb32 ? 4 : 2); - if (!sw->menu_texture.pixels || - sw->menu_texture.width != width || - sw->menu_texture.height != height) + if ( !sw->menu_texture.pixels + || (sw->menu_texture.width != width) + || (sw->menu_texture.height != height)) { int xsf, ysf, sf; struct scaler_ctx *sctx = NULL; @@ -869,10 +867,7 @@ static void switch_set_texture_frame( memcpy(sw->menu_texture.pixels, frame, sz); } -static void switch_apply_state_changes(void *data) -{ - (void)data; -} +static void switch_apply_state_changes(void *data) { } static void switch_set_texture_enable(void *data, bool enable, bool full_screen) { diff --git a/gfx/drivers/vulkan.c b/gfx/drivers/vulkan.c index af8d22771d1..905790a730d 100644 --- a/gfx/drivers/vulkan.c +++ b/gfx/drivers/vulkan.c @@ -3411,6 +3411,8 @@ static void *vulkan_init(const video_info_t *video, video_driver_get_size(&temp_width, &temp_height); vk->video_width = temp_width; vk->video_height = temp_height; + vk->translate_x = 0.0; + vk->translate_y = 0.0; RARCH_LOG("[Vulkan]: Using resolution %ux%u.\n", temp_width, temp_height); @@ -3762,25 +3764,40 @@ static void vulkan_set_projection(vk_t *vk, 0.0f, 0.0f, 0.0f, 0.0f , 0.0f, 0.0f, 0.0f, 1.0f } }; + math_matrix_4x4 trn = { + { 1.0f, 0.0f, 0.0f, 0.0f , + 0.0f, 1.0f, 0.0f, 0.0f , + 0.0f, 0.0f, 1.0f, 0.0f , + vk->translate_x/(float)vk->vp.width, + vk->translate_y/(float)vk->vp.height, + 0.0f, + 1.0f } + }; + math_matrix_4x4 tmp = { + { 1.0f, 0.0f, 0.0f, 0.0f , + 0.0f, 1.0f, 0.0f, 0.0f , + 0.0f, 0.0f, 1.0f, 0.0f , + 0.0f, 0.0f, 0.0f, 1.0f } + }; /* Calculate projection. */ matrix_4x4_ortho(vk->mvp_no_rot, ortho->left, ortho->right, ortho->bottom, ortho->top, ortho->znear, ortho->zfar); if (!allow_rotate) + tmp = vk->mvp_no_rot; + else { - vk->mvp = vk->mvp_no_rot; - return; + radians = M_PI * vk->rotation / 180.0f; + cosine = cosf(radians); + sine = sinf(radians); + MAT_ELEM_4X4(rot, 0, 0) = cosine; + MAT_ELEM_4X4(rot, 0, 1) = -sine; + MAT_ELEM_4X4(rot, 1, 0) = sine; + MAT_ELEM_4X4(rot, 1, 1) = cosine; + matrix_4x4_multiply(tmp, rot, vk->mvp_no_rot); } - - radians = M_PI * vk->rotation / 180.0f; - cosine = cosf(radians); - sine = sinf(radians); - MAT_ELEM_4X4(rot, 0, 0) = cosine; - MAT_ELEM_4X4(rot, 0, 1) = -sine; - MAT_ELEM_4X4(rot, 1, 0) = sine; - MAT_ELEM_4X4(rot, 1, 1) = cosine; - matrix_4x4_multiply(vk->mvp, rot, vk->mvp_no_rot); + matrix_4x4_multiply(vk->mvp, trn, tmp); } static void vulkan_set_rotation(void *data, unsigned rotation) @@ -3808,8 +3825,6 @@ static void vulkan_set_video_mode(void *data, static void vulkan_set_viewport(void *data, unsigned viewport_width, unsigned viewport_height, bool force_full, bool allow_rotate) { - int x = 0; - int y = 0; float device_aspect = (float)viewport_width / viewport_height; struct video_ortho ortho = {0, 1, 0, 1, -1, 1}; settings_t *settings = config_get_ptr(); @@ -3827,14 +3842,13 @@ static void vulkan_set_viewport(void *data, unsigned viewport_width, video_driver_get_aspect_ratio(), vk->flags & VK_FLAG_KEEP_ASPECT, true); - vk->vp.x = MAX(vk->vp.x, 0); - vk->vp.y = MAX(vk->vp.y, 0); viewport_width = vk->vp.width; viewport_height = vk->vp.height; } else if ((vk->flags & VK_FLAG_KEEP_ASPECT) && !force_full) { - video_viewport_get_scaled_aspect2(&vk->vp, viewport_width, viewport_height, true, device_aspect, video_driver_get_aspect_ratio()); + video_viewport_get_scaled_aspect2(&vk->vp, viewport_width, viewport_height, + true, device_aspect, video_driver_get_aspect_ratio()); viewport_width = vk->vp.width; viewport_height = vk->vp.height; } @@ -3846,6 +3860,21 @@ static void vulkan_set_viewport(void *data, unsigned viewport_width, vk->vp.height = viewport_height; } + if (vk->vp.x < 0) + { + vk->translate_x = (float)vk->vp.x; + vk->vp.x = 0.0; + } + else + vk->translate_x = 0.0; + if (vk->vp.y < 0) + { + vk->translate_y = (float)vk->vp.y; + vk->vp.y = 0.0; + } + else + vk->translate_y = 0.0; + vulkan_set_projection(vk, &ortho, allow_rotate); /* Set last backbuffer viewport. */ @@ -4492,7 +4521,7 @@ static bool vulkan_frame(void *data, const void *frame, vulkan_filter_chain_set_frame_count( (vulkan_filter_chain_t*)vk->filter_chain, frame_count); - /* Sub-frame info for multiframe shaders (per real content frame). + /* Sub-frame info for multiframe shaders (per real content frame). Should always be 1 for non-use of subframes*/ if (!(vk->context->flags & VK_CTX_FLAG_SWAP_INTERVAL_EMULATION_LOCK)) { @@ -4522,16 +4551,12 @@ static bool vulkan_frame(void *data, const void *frame, && !runloop_is_paused && (!(vk->flags & VK_FLAG_MENU_ENABLE)) && !(vk->context->swap_interval > 1)) - { vulkan_filter_chain_set_simulate_scanline( (vulkan_filter_chain_t*)vk->filter_chain, true); - } else - { vulkan_filter_chain_set_simulate_scanline( (vulkan_filter_chain_t*)vk->filter_chain, false); - } -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ #ifdef HAVE_REWIND vulkan_filter_chain_set_frame_direction( diff --git a/gfx/drivers_font/d3d9x_w32_font.c b/gfx/drivers_font/d3d9x_w32_font.c index 0a1534ec074..261176e9419 100644 --- a/gfx/drivers_font/d3d9x_w32_font.c +++ b/gfx/drivers_font/d3d9x_w32_font.c @@ -96,7 +96,7 @@ static void *d3d9x_win32_font_init(void *video_data, &desc, (void**)&d3dfonts->font)) goto error; - font = d3dfonts->font; + font = (ID3DXFont*)d3dfonts->font; font->lpVtbl->GetTextMetrics(font, &metrics); @@ -117,7 +117,7 @@ static void d3d9x_win32_font_free(void *data, bool is_threaded) if (!d3dfonts) return; - font = d3dfonts->font; + font = (ID3DXFont*)d3dfonts->font; if (font) font->lpVtbl->Release(font); @@ -135,7 +135,7 @@ static int d3d9x_win32_font_get_message_width(void* data, const char* msg, if (!d3dfonts || !msg) return 0; - font = d3dfonts->font; + font = (ID3DXFont*)d3dfonts->font; font->lpVtbl->DrawText(font, NULL, (void*)msg, msg_len ? (INT)msg_len : -1, &box, DT_CALCRECT, 0); @@ -164,7 +164,7 @@ static void d3d9x_win32_font_render_msg( if (!d3dfonts || !msg) return; - font = d3dfonts->font; + font = (ID3DXFont*)d3dfonts->font; width = d3dfonts->d3d->video_info.width; height = d3dfonts->d3d->video_info.height; diff --git a/gfx/drivers_shader/glslang.cpp b/gfx/drivers_shader/glslang.cpp index fc3bda54242..e586e66d6f2 100644 --- a/gfx/drivers_shader/glslang.cpp +++ b/gfx/drivers_shader/glslang.cpp @@ -33,9 +33,6 @@ #include "../../verbosity.h" -using namespace glslang; -using namespace std; - struct SlangProcess { public: @@ -58,12 +55,12 @@ struct SlangProcessHolder SlangProcessHolder() { glslang_global_lock.lock(); - InitializeProcess(); + glslang::InitializeProcess(); } ~SlangProcessHolder() { - FinalizeProcess(); + glslang::FinalizeProcess(); glslang_global_lock.unlock(); } }; @@ -390,10 +387,10 @@ SlangProcess::SlangProcess() } } -bool glslang::compile_spirv(const string &source, Stage stage, +bool glslang::compile_spirv(const std::string &source, Stage stage, std::vector *spirv) { - string msg; + std::string msg; static SlangProcess process; SlangProcessHolder process_holder; TProgram program; diff --git a/gfx/drivers_shader/glslang_util_cxx.cpp b/gfx/drivers_shader/glslang_util_cxx.cpp index bb339c16895..4f1fa0095d2 100644 --- a/gfx/drivers_shader/glslang_util_cxx.cpp +++ b/gfx/drivers_shader/glslang_util_cxx.cpp @@ -156,14 +156,14 @@ bool glslang_parse_meta(const struct string_list *lines, glslang_meta *meta) * if they are exactly the same. */ if (parameter_found) { - const glslang_parameter *parameter = + const glslang_parameter *parameter = &meta->parameters[parameter_index]; - if ( parameter->desc != desc || - parameter->initial != initial || - parameter->minimum != minimum || - parameter->maximum != maximum || - parameter->step != step + if ( (parameter->desc != desc) + || (parameter->initial != initial) + || (parameter->minimum != minimum) + || (parameter->maximum != maximum) + || (parameter->step != step) ) { RARCH_ERR("[slang]: Duplicate parameters found for \"%s\", but arguments do not match.\n", id); @@ -214,7 +214,7 @@ bool glslang_compile_shader(const char *shader_path, glslang_output *output) { #if defined(HAVE_GLSLANG) struct string_list lines; - + if (!string_list_initialize(&lines)) return false; diff --git a/gfx/drivers_shader/shader_gl3.cpp b/gfx/drivers_shader/shader_gl3.cpp index ad7787e049d..2038b66fe21 100644 --- a/gfx/drivers_shader/shader_gl3.cpp +++ b/gfx/drivers_shader/shader_gl3.cpp @@ -58,196 +58,81 @@ static void gl3_build_default_matrix(float *data) data[15] = 1.0f; } -static void gl3_framebuffer_copy( - GLuint fb_id, - GLuint quad_program, - GLuint quad_vbo, - GLint flat_ubo_vertex, - struct Size2D size, - GLuint image) -{ - glBindFramebuffer(GL_FRAMEBUFFER, fb_id); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glViewport(0, 0, size.width, size.height); - glClear(GL_COLOR_BUFFER_BIT); - - glUseProgram(quad_program); - if (flat_ubo_vertex >= 0) - { - static float mvp[16] = { - 2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 0.0f, - -1.0f,-1.0f, 0.0f, 1.0f - }; - glUniform4fv(flat_ubo_vertex, 4, mvp); - } - - /* Draw quad */ - glDisable(GL_CULL_FACE); - glDisable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - glBindBuffer(GL_ARRAY_BUFFER, quad_vbo); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), - (void *)((uintptr_t)(0))); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), - (void *)((uintptr_t)(2 * sizeof(float)))); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); - - glUseProgram(0); - glBindTexture(GL_TEXTURE_2D, 0); - glBindFramebuffer(GL_FRAMEBUFFER, 0); -} - -static void gl3_framebuffer_copy_partial( - GLuint fb_id, - GLuint quad_program, - GLint flat_ubo_vertex, - struct Size2D size, - GLuint image, - float rx, float ry) -{ - GLuint vbo; - const float quad_data[16] = { - 0.0f, 0.0f, 0.0f, 0.0f, - 1.0f, 0.0f, rx, 0.0f, - 0.0f, 1.0f, 0.0f, ry, - 1.0f, 1.0f, rx, ry, - }; - - glBindFramebuffer(GL_FRAMEBUFFER, fb_id); - glActiveTexture(GL_TEXTURE2); - glBindTexture(GL_TEXTURE_2D, image); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MAG_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_MIN_FILTER, GL_NEAREST); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_S, GL_CLAMP_TO_EDGE); - glTexParameteri(GL_TEXTURE_2D, GL_TEXTURE_WRAP_T, GL_CLAMP_TO_EDGE); - glViewport(0, 0, size.width, size.height); - glClear(GL_COLOR_BUFFER_BIT); - - glUseProgram(quad_program); - if (flat_ubo_vertex >= 0) - { - static float mvp[16] = { - 2.0f, 0.0f, 0.0f, 0.0f, - 0.0f, 2.0f, 0.0f, 0.0f, - 0.0f, 0.0f, 2.0f, 0.0f, - -1.0f,-1.0f, 0.0f, 1.0f - }; - glUniform4fv(flat_ubo_vertex, 4, mvp); - } - glDisable(GL_CULL_FACE); - glDisable(GL_BLEND); - glDisable(GL_DEPTH_TEST); - glEnableVertexAttribArray(0); - glEnableVertexAttribArray(1); - - /* A bit crude, but heeeey. */ - glGenBuffers(1, &vbo); - glBindBuffer(GL_ARRAY_BUFFER, vbo); - - glBufferData(GL_ARRAY_BUFFER, sizeof(quad_data), quad_data, GL_STREAM_DRAW); - glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), - (void *)((uintptr_t)(0))); - glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4 * sizeof(float), - (void *)((uintptr_t)(2 * sizeof(float)))); - glDrawArrays(GL_TRIANGLE_STRIP, 0, 4); - glBindBuffer(GL_ARRAY_BUFFER, 0); - glDeleteBuffers(1, &vbo); - glDisableVertexAttribArray(0); - glDisableVertexAttribArray(1); - glUseProgram(0); - glBindTexture(GL_TEXTURE_2D, 0); - glBindFramebuffer(GL_FRAMEBUFFER, 0); -} - -static GLuint gl3_compile_shader(GLenum stage, const char *source) -{ - GLint status; - GLuint shader = glCreateShader(stage); - const char *ptr = source; - - glShaderSource(shader, 1, &ptr, NULL); - glCompileShader(shader); - - glGetShaderiv(shader, GL_COMPILE_STATUS, &status); - - if (!status) - { - GLint length; - glGetShaderiv(shader, GL_INFO_LOG_LENGTH, &length); - if (length > 0) +extern "C" { + + void gl3_framebuffer_copy( + GLuint fb_id, + GLuint quad_program, + GLuint quad_vbo, + GLint flat_ubo_vertex, + struct Size2D size, + GLuint image); + + void gl3_framebuffer_copy_partial( + GLuint fb_id, + GLuint quad_program, + GLint flat_ubo_vertex, + struct Size2D size, + GLuint image, + float rx, float ry); + + GLuint gl3_compile_shader(GLenum stage, const char *source); + uint32_t gl3_get_cross_compiler_target_version(void); + + static GLenum address_to_gl(glslang_filter_chain_address type) + { + switch (type) { - char *info_log = (char*)malloc(length); - - if (info_log) - { - glGetShaderInfoLog(shader, length, &length, info_log); - RARCH_ERR("[GLCore]: Failed to compile shader: %s\n", info_log); - free(info_log); - glDeleteShader(shader); - return 0; - } - } - } - - return shader; -} - -static uint32_t gl3_get_cross_compiler_target_version(void) -{ - const char *version = (const char*)glGetString(GL_VERSION); - unsigned major = 0; - unsigned minor = 0; - #ifdef HAVE_OPENGLES3 - if (!version || sscanf(version, "OpenGL ES %u.%u", &major, &minor) != 2) - return 300; - - if (major == 2 && minor == 0) - return 100; + case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER: +#if 0 + RARCH_WARN("[GLCore]: No CLAMP_TO_BORDER in GLES3. Falling back to edge clamp.\n"); +#endif + return GL_CLAMP_TO_EDGE; #else - if (!version || sscanf(version, "%u.%u", &major, &minor) != 2) - return 150; - - if (major == 3) - { - switch (minor) - { - case 2: - return 150; - case 1: - return 140; - case 0: - return 130; + case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER: + return GL_CLAMP_TO_BORDER; +#endif + case GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT: + return GL_REPEAT; + case GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT: + return GL_MIRRORED_REPEAT; + case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE: + default: + break; } + + return GL_CLAMP_TO_EDGE; } - else if (major == 2) + + static GLenum convert_filter_to_mag_gl(glslang_filter_chain_filter filter) { - switch (minor) + switch (filter) { - case 1: - return 120; - case 0: - return 110; + case GLSLANG_FILTER_CHAIN_LINEAR: + return GL_LINEAR; + case GLSLANG_FILTER_CHAIN_NEAREST: + default: + break; } + + return GL_NEAREST; } -#endif - return 100 * major + 10 * minor; + static GLenum convert_filter_to_min_gl(glslang_filter_chain_filter filter, glslang_filter_chain_filter mipfilter) + { + if ( (filter == GLSLANG_FILTER_CHAIN_LINEAR) + && (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR) + ) + return GL_LINEAR_MIPMAP_LINEAR; + else if (filter == GLSLANG_FILTER_CHAIN_LINEAR) + return GL_LINEAR_MIPMAP_NEAREST; + else if (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR) + return GL_NEAREST_MIPMAP_LINEAR; + return GL_NEAREST_MIPMAP_NEAREST; + } } - GLuint gl3_cross_compile_program( const uint32_t *vertex, size_t vertex_size, const uint32_t *fragment, size_t fragment_size, @@ -493,59 +378,6 @@ struct Texture glslang_filter_chain_address address; }; -static GLenum address_to_gl(glslang_filter_chain_address type) -{ - switch (type) - { -#ifdef HAVE_OPENGLES3 - case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER: -#if 0 - RARCH_WARN("[GLCore]: No CLAMP_TO_BORDER in GLES3. Falling back to edge clamp.\n"); -#endif - return GL_CLAMP_TO_EDGE; -#else - case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_BORDER: - return GL_CLAMP_TO_BORDER; -#endif - case GLSLANG_FILTER_CHAIN_ADDRESS_REPEAT: - return GL_REPEAT; - case GLSLANG_FILTER_CHAIN_ADDRESS_MIRRORED_REPEAT: - return GL_MIRRORED_REPEAT; - case GLSLANG_FILTER_CHAIN_ADDRESS_CLAMP_TO_EDGE: - default: - break; - } - - return GL_CLAMP_TO_EDGE; -} - -static GLenum convert_filter_to_mag_gl(glslang_filter_chain_filter filter) -{ - switch (filter) - { - case GLSLANG_FILTER_CHAIN_LINEAR: - return GL_LINEAR; - case GLSLANG_FILTER_CHAIN_NEAREST: - default: - break; - } - - return GL_NEAREST; -} - -static GLenum convert_filter_to_min_gl(glslang_filter_chain_filter filter, glslang_filter_chain_filter mipfilter) -{ - if ( (filter == GLSLANG_FILTER_CHAIN_LINEAR) - && (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR) - ) - return GL_LINEAR_MIPMAP_LINEAR; - else if (filter == GLSLANG_FILTER_CHAIN_LINEAR) - return GL_LINEAR_MIPMAP_NEAREST; - else if (mipfilter == GLSLANG_FILTER_CHAIN_LINEAR) - return GL_NEAREST_MIPMAP_LINEAR; - return GL_NEAREST_MIPMAP_NEAREST; -} - static GLenum convert_glslang_format(glslang_format fmt) { #undef FMT @@ -2145,10 +1977,11 @@ bool gl3_filter_chain::init_history() common.original_history.clear(); for (i = 0; i < passes.size(); i++) - required_images = - std::max(required_images, - passes[i]->get_reflection().semantic_textures[ - SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY].size()); + { + size_t _y = passes[i]->get_reflection().semantic_textures[ + SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY].size(); + required_images = MAX(required_images, _y); + } if (required_images < 2) { @@ -2618,11 +2451,11 @@ gl3_filter_chain_t *gl3_filter_chain_create_from_preset( { /* Allow duplicate #pragma parameter, but * only if they are exactly the same. */ - if (meta_param.desc != itr->desc || - meta_param.initial != itr->initial || - meta_param.minimum != itr->minimum || - meta_param.maximum != itr->maximum || - meta_param.step != itr->step) + if ( meta_param.desc != itr->desc + || meta_param.initial != itr->initial + || meta_param.minimum != itr->minimum + || meta_param.maximum != itr->maximum + || meta_param.step != itr->step) { RARCH_ERR("[GLCore]: Duplicate parameters found for \"%s\", but arguments do not match.\n", itr->id); diff --git a/gfx/drivers_shader/shader_vulkan.cpp b/gfx/drivers_shader/shader_vulkan.cpp index 1c529791c66..c64078812ba 100644 --- a/gfx/drivers_shader/shader_vulkan.cpp +++ b/gfx/drivers_shader/shader_vulkan.cpp @@ -46,308 +46,6 @@ static const uint32_t opaque_frag[] = #include "../drivers/vulkan_shaders/opaque.frag.inc" ; -static void vulkan_initialize_render_pass(VkDevice device, VkFormat format, - VkRenderPass *render_pass) -{ - VkAttachmentReference color_ref; - VkRenderPassCreateInfo rp_info; - VkAttachmentDescription attachment; - VkSubpassDescription subpass; - - rp_info.sType = VK_STRUCTURE_TYPE_RENDER_PASS_CREATE_INFO; - rp_info.pNext = NULL; - rp_info.flags = 0; - rp_info.attachmentCount = 1; - rp_info.pAttachments = &attachment; - rp_info.subpassCount = 1; - rp_info.pSubpasses = &subpass; - rp_info.dependencyCount = 0; - rp_info.pDependencies = NULL; - - color_ref.attachment = 0; - color_ref.layout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - /* We will always write to the entire framebuffer, - * so we don't really need to clear. */ - attachment.flags = 0; - attachment.format = format; - attachment.samples = VK_SAMPLE_COUNT_1_BIT; - attachment.loadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachment.storeOp = VK_ATTACHMENT_STORE_OP_STORE; - attachment.stencilLoadOp = VK_ATTACHMENT_LOAD_OP_DONT_CARE; - attachment.stencilStoreOp = VK_ATTACHMENT_STORE_OP_DONT_CARE; - attachment.initialLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - attachment.finalLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - - subpass.flags = 0; - subpass.pipelineBindPoint = VK_PIPELINE_BIND_POINT_GRAPHICS; - subpass.inputAttachmentCount = 0; - subpass.pInputAttachments = NULL; - subpass.colorAttachmentCount = 1; - subpass.pColorAttachments = &color_ref; - subpass.pResolveAttachments = NULL; - subpass.pDepthStencilAttachment = NULL; - subpass.preserveAttachmentCount = 0; - subpass.pPreserveAttachments = NULL; - - vkCreateRenderPass(device, &rp_info, NULL, render_pass); -} - -static void vulkan_framebuffer_clear(VkImage image, VkCommandBuffer cmd) -{ - VkClearColorValue color; - VkImageSubresourceRange range; - - VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_PIPELINE_STAGE_TOP_OF_PIPE_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_QUEUE_FAMILY_IGNORED, - VK_QUEUE_FAMILY_IGNORED); - - color.float32[0] = 0.0f; - color.float32[1] = 0.0f; - color.float32[2] = 0.0f; - color.float32[3] = 0.0f; - range.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - range.baseMipLevel = 0; - range.levelCount = 1; - range.baseArrayLayer = 0; - range.layerCount = 1; - - vkCmdClearColorImage(cmd, - image, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - &color, - 1, - &range); - - VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_QUEUE_FAMILY_IGNORED, - VK_QUEUE_FAMILY_IGNORED); -} - -static void vulkan_framebuffer_generate_mips( - VkFramebuffer framebuffer, - VkImage image, - struct Size2D size, - VkCommandBuffer cmd, - unsigned levels - ) -{ - unsigned i; - /* This is run every frame, so make sure - * we aren't opting into the "lazy" way of doing this. :) */ - VkImageMemoryBarrier barriers[2]; - - /* First, transfer the input mip level to TRANSFER_SRC_OPTIMAL. - * This should allow the surface to stay compressed. - * All subsequent mip-layers are now transferred into DST_OPTIMAL from - * UNDEFINED at this point. - */ - - /* Input */ - barriers[0].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barriers[0].pNext = NULL; - barriers[0].srcAccessMask = VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT; - barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barriers[0].oldLayout = VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL; - barriers[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - barriers[0].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barriers[0].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barriers[0].image = image; - barriers[0].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barriers[0].subresourceRange.baseMipLevel = 0; - barriers[0].subresourceRange.levelCount = 1; - barriers[0].subresourceRange.baseArrayLayer = 0; - barriers[0].subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - /* The rest of the mip chain */ - barriers[1].sType = VK_STRUCTURE_TYPE_IMAGE_MEMORY_BARRIER; - barriers[1].pNext = NULL; - barriers[1].srcAccessMask = 0; - barriers[1].dstAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barriers[1].oldLayout = VK_IMAGE_LAYOUT_UNDEFINED; - barriers[1].newLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - barriers[1].srcQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barriers[1].dstQueueFamilyIndex = VK_QUEUE_FAMILY_IGNORED; - barriers[1].image = image; - barriers[1].subresourceRange.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - barriers[1].subresourceRange.baseMipLevel = 1; - barriers[1].subresourceRange.levelCount = VK_REMAINING_MIP_LEVELS; - barriers[1].subresourceRange.baseArrayLayer = 0; - barriers[1].subresourceRange.layerCount = VK_REMAINING_ARRAY_LAYERS; - - vkCmdPipelineBarrier(cmd, - VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - 0, - NULL, - 0, - NULL, - 2, - barriers); - - for (i = 1; i < levels; i++) - { - unsigned src_width, src_height, target_width, target_height; - VkImageBlit blit_region = {{0}}; - - /* For subsequent passes, we have to transition - * from DST_OPTIMAL to SRC_OPTIMAL, - * but only do so one mip-level at a time. */ - if (i > 1) - { - barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barriers[0].dstAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barriers[0].subresourceRange.baseMipLevel = i - 1; - barriers[0].subresourceRange.levelCount = 1; - barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - barriers[0].newLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - - vkCmdPipelineBarrier(cmd, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - 0, - 0, - NULL, - 0, - NULL, - 1, - barriers); - } - - src_width = MAX(size.width >> (i - 1), 1u); - src_height = MAX(size.height >> (i - 1), 1u); - target_width = MAX(size.width >> i, 1u); - target_height = MAX(size.height >> i, 1u); - - blit_region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - blit_region.srcSubresource.mipLevel = i - 1; - blit_region.srcSubresource.baseArrayLayer = 0; - blit_region.srcSubresource.layerCount = 1; - blit_region.dstSubresource = blit_region.srcSubresource; - blit_region.dstSubresource.mipLevel = i; - blit_region.srcOffsets[1].x = src_width; - blit_region.srcOffsets[1].y = src_height; - blit_region.srcOffsets[1].z = 1; - blit_region.dstOffsets[1].x = target_width; - blit_region.dstOffsets[1].y = target_height; - blit_region.dstOffsets[1].z = 1; - - vkCmdBlitImage(cmd, - image, VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL, - image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, &blit_region, VK_FILTER_LINEAR); - } - - /* We are now done, and we have all mip-levels except - * the last in TRANSFER_SRC_OPTIMAL, - * and the last one still on TRANSFER_DST_OPTIMAL, - * so do a final barrier which - * moves everything to SHADER_READ_ONLY_OPTIMAL in - * one go along with the execution barrier to next pass. - * Read-to-read memory barrier, so only need execution - * barrier for first transition. - */ - barriers[0].srcAccessMask = VK_ACCESS_TRANSFER_READ_BIT; - barriers[0].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - barriers[0].subresourceRange.baseMipLevel = 0; - barriers[0].subresourceRange.levelCount = levels - 1; - barriers[0].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_SRC_OPTIMAL; - barriers[0].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - - /* This is read-after-write barrier. */ - barriers[1].srcAccessMask = VK_ACCESS_TRANSFER_WRITE_BIT; - barriers[1].dstAccessMask = VK_ACCESS_SHADER_READ_BIT; - barriers[1].subresourceRange.baseMipLevel = levels - 1; - barriers[1].subresourceRange.levelCount = 1; - barriers[1].oldLayout = VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL; - barriers[1].newLayout = VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL; - - vkCmdPipelineBarrier(cmd, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - 0, - 0, - NULL, - 0, - NULL, - 2, barriers); - - /* Next pass will wait for ALL_GRAPHICS_BIT, and since - * we have dstStage as FRAGMENT_SHADER, - * the dependency chain will ensure we don't start - * next pass until the mipchain is complete. */ -} - -static void vulkan_framebuffer_copy(VkImage image, - struct Size2D size, - VkCommandBuffer cmd, - VkImage src_image, VkImageLayout src_layout) -{ - VkImageCopy region; - - VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS( - cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_UNDEFINED, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 0, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_QUEUE_FAMILY_IGNORED, - VK_QUEUE_FAMILY_IGNORED); - - region.srcSubresource.aspectMask = VK_IMAGE_ASPECT_COLOR_BIT; - region.srcSubresource.mipLevel = 0; - region.srcSubresource.baseArrayLayer = 0; - region.srcSubresource.layerCount = 1; - region.srcOffset.x = 0; - region.srcOffset.y = 0; - region.srcOffset.z = 0; - region.dstSubresource = region.srcSubresource; - region.dstOffset.x = 0; - region.dstOffset.y = 0; - region.dstOffset.z = 0; - region.extent.width = size.width; - region.extent.height = size.height; - region.extent.depth = 1; - - vkCmdCopyImage(cmd, - src_image, src_layout, - image, VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - 1, ®ion); - - VULKAN_IMAGE_LAYOUT_TRANSITION_LEVELS(cmd, - image, - VK_REMAINING_MIP_LEVELS, - VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, - VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, - VK_ACCESS_TRANSFER_WRITE_BIT, - VK_ACCESS_SHADER_READ_BIT, - VK_PIPELINE_STAGE_TRANSFER_BIT, - VK_PIPELINE_STAGE_FRAGMENT_SHADER_BIT, - VK_QUEUE_FAMILY_IGNORED, - VK_QUEUE_FAMILY_IGNORED); -} - struct Texture { vulkan_filter_chain_texture texture; @@ -512,9 +210,9 @@ class Pass cache(cache), num_sync_indices(num_sync_indices), final_pass(final_pass) -#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION +#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION ,simulate_scanline(false) -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ {} ~Pass(); @@ -551,14 +249,14 @@ class Pass void set_frame_count_period(unsigned p) { frame_count_period = p; } void set_shader_subframes(uint32_t ts) { total_subframes = ts; } void set_current_shader_subframe(uint32_t cs) { current_subframe = cs; } -#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION +#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION void set_simulate_scanline(bool simulate) { simulate_scanline = simulate; } -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ void set_frame_direction(int32_t dir) { frame_direction = dir; } void set_rotation(uint32_t rot) { rotation = rot; } void set_name(const char *name) { pass_name = name; } const std::string &get_name() const { return pass_name; } - glslang_filter_chain_filter get_source_filter() const { + glslang_filter_chain_filter get_source_filter() const { return pass_info.source_filter; } glslang_filter_chain_filter get_mip_filter() const @@ -587,9 +285,9 @@ class Pass unsigned num_sync_indices; unsigned sync_index; bool final_pass; -#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION +#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION bool simulate_scanline; -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ Size2D get_output_size(const Size2D &original_size, const Size2D &max_source) const; @@ -708,9 +406,9 @@ struct vulkan_filter_chain void set_frame_count_period(unsigned pass, unsigned period); void set_shader_subframes(uint32_t total_subframes); void set_current_shader_subframe(uint32_t current_subframe); - #ifdef VULKAN_ROLLING_SCANLINE_SIMULATION +#ifdef VULKAN_ROLLING_SCANLINE_SIMULATION void set_simulate_scanline(bool simulate_scanline); - #endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ void set_frame_direction(int32_t direction); void set_rotation(uint32_t rot); void set_pass_name(unsigned pass, const char *name); @@ -878,7 +576,7 @@ static std::unique_ptr vulkan_filter_chain_load_lut( image_info.extent.width = image.width; image_info.extent.height = image.height; image_info.extent.depth = 1; - image_info.mipLevels = shader->mipmap + image_info.mipLevels = shader->mipmap ? glslang_num_miplevels(image.width, image.height) : 1; image_info.arrayLayers = 1; image_info.samples = VK_SAMPLE_COUNT_1_BIT; @@ -926,7 +624,7 @@ static std::unique_ptr vulkan_filter_chain_load_lut( view_info.subresourceRange.layerCount = 1; vkCreateImageView(info->device, &view_info, nullptr, &view); - buffer = + buffer = std::unique_ptr(new Buffer(info->device, *info->memory_properties, image.width * image.height * sizeof(uint32_t), VK_BUFFER_USAGE_TRANSFER_SRC_BIT)); ptr = buffer->map(); @@ -937,8 +635,8 @@ static std::unique_ptr vulkan_filter_chain_load_lut( tex, VK_REMAINING_MIP_LEVELS, VK_IMAGE_LAYOUT_UNDEFINED, - shader->mipmap - ? VK_IMAGE_LAYOUT_GENERAL + shader->mipmap + ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 0, VK_ACCESS_TRANSFER_WRITE_BIT, @@ -965,8 +663,8 @@ static std::unique_ptr vulkan_filter_chain_load_lut( vkCmdCopyBufferToImage(cmd, buffer->get_buffer(), tex, - shader->mipmap - ? VK_IMAGE_LAYOUT_GENERAL + shader->mipmap + ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, 1, ®ion); @@ -1022,8 +720,8 @@ static std::unique_ptr vulkan_filter_chain_load_lut( cmd, tex, VK_REMAINING_MIP_LEVELS, - shader->mipmap - ? VK_IMAGE_LAYOUT_GENERAL + shader->mipmap + ? VK_IMAGE_LAYOUT_GENERAL : VK_IMAGE_LAYOUT_TRANSFER_DST_OPTIMAL, VK_IMAGE_LAYOUT_SHADER_READ_ONLY_OPTIMAL, VK_ACCESS_TRANSFER_WRITE_BIT, @@ -1080,7 +778,7 @@ static bool vulkan_filter_chain_load_luts( for (i = 0; i < shader->luts; i++) { - std::unique_ptr image = + std::unique_ptr image = vulkan_filter_chain_load_lut(cmd, info, chain, &shader->lut[i]); if (!image) { @@ -1244,7 +942,7 @@ void vulkan_filter_chain::build_offscreen_passes(VkCommandBuffer cmd, unsigned i; Texture source; - /* First frame, make sure our history and feedback textures + /* First frame, make sure our history and feedback textures * are in a clean state. */ if (require_clear) { @@ -1312,7 +1010,7 @@ void vulkan_filter_chain::update_history(DeferredDisposer &disposer, if ( input_texture.width != tmp->get_size().width || input_texture.height != tmp->get_size().height - || (input_texture.format != VK_FORMAT_UNDEFINED + || (input_texture.format != VK_FORMAT_UNDEFINED && input_texture.format != tmp->get_format())) tmp->set_size(disposer, { input_texture.width, input_texture.height }, input_texture.format); @@ -1358,7 +1056,7 @@ void vulkan_filter_chain::build_viewport_pass( unsigned i; Texture source; - /* First frame, make sure our history and + /* First frame, make sure our history and * feedback textures are in a clean state. */ if (require_clear) { @@ -1412,10 +1110,11 @@ bool vulkan_filter_chain::init_history() common.original_history.clear(); for (i = 0; i < passes.size(); i++) - required_images = - std::max(required_images, - passes[i]->get_reflection().semantic_textures[ - SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY].size()); + { + size_t _y = passes[i]->get_reflection().semantic_textures[ + SLANG_TEXTURE_SEMANTIC_ORIGINAL_HISTORY].size(); + required_images = MAX(required_images, _y); + } if (required_images < 2) { @@ -1496,7 +1195,7 @@ bool vulkan_filter_chain::init_feedback() bool vulkan_filter_chain::init_alias() { int i; - + common.texture_semantic_map.clear(); common.texture_semantic_uniform_map.clear(); @@ -1619,7 +1318,7 @@ bool vulkan_filter_chain::init_ubo() for (i = 0; i < passes.size(); i++) passes[i]->allocate_buffers(); - common.ubo_offset = + common.ubo_offset = (common.ubo_offset + common.ubo_alignment - 1) & ~(common.ubo_alignment - 1); common.ubo_sync_index_stride = common.ubo_offset; @@ -1726,7 +1425,7 @@ void vulkan_filter_chain::set_simulate_scanline(bool simulate_scanline) for (i = 0; i < passes.size(); i++) passes[i]->set_simulate_scanline(simulate_scanline); } -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ void vulkan_filter_chain::set_frame_direction(int32_t direction) { @@ -2230,7 +1929,7 @@ bool Pass::init_pipeline() pipe.pColorBlendState = &blend; pipe.pDynamicState = &dynamic; pipe.layout = pipeline_layout; - pipe.renderPass = final_pass + pipe.renderPass = final_pass ? swapchain_render_pass : framebuffer->get_render_pass(); pipe.subpass = 0; @@ -2275,7 +1974,7 @@ CommonResources::CommonResources(VkDevice device, 1.0f, +1.0f, 1.0f, 1.0f, }; - vbo = + vbo = std::unique_ptr(new Buffer(device, memory_properties, sizeof(vbo_data), VK_BUFFER_USAGE_VERTEX_BUFFER_BIT)); @@ -2629,8 +2328,8 @@ void Pass::build_semantics(VkDescriptorSet set, uint8_t *buffer, unsigned(current_viewport.height)); build_semantic_uint(buffer, SLANG_SEMANTIC_FRAME_COUNT, - frame_count_period - ? uint32_t(frame_count % frame_count_period) + frame_count_period + ? uint32_t(frame_count % frame_count_period) : uint32_t(frame_count)); build_semantic_int(buffer, SLANG_SEMANTIC_FRAME_DIRECTION, @@ -2737,7 +2436,7 @@ void Pass::build_commands( VK_IMAGE_LAYOUT_UNDEFINED, VK_IMAGE_LAYOUT_COLOR_ATTACHMENT_OPTIMAL, 0, - VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | + VK_ACCESS_COLOR_ATTACHMENT_READ_BIT | VK_ACCESS_COLOR_ATTACHMENT_WRITE_BIT, VK_PIPELINE_STAGE_ALL_GRAPHICS_BIT, VK_PIPELINE_STAGE_COLOR_ATTACHMENT_OUTPUT_BIT, @@ -2787,7 +2486,7 @@ void Pass::build_commands( const VkRect2D sci = { { int32_t(current_viewport.x), - int32_t((current_viewport.height / float(total_subframes)) + int32_t((current_viewport.height / float(total_subframes)) * float(current_subframe - 1)) }, { @@ -2798,7 +2497,7 @@ void Pass::build_commands( vkCmdSetScissor(cmd, 0, 1, &sci); } else -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ { const VkRect2D sci = { { @@ -2811,7 +2510,7 @@ void Pass::build_commands( }, }; vkCmdSetScissor(cmd, 0, 1, &sci); - } + } } else { @@ -2830,7 +2529,7 @@ void Pass::build_commands( const VkRect2D sci = { { 0, - int32_t((float(current_framebuffer_size.height) / float(total_subframes)) + int32_t((float(current_framebuffer_size.height) / float(total_subframes)) * float(current_subframe - 1)) }, { @@ -2841,7 +2540,7 @@ void Pass::build_commands( vkCmdSetScissor(cmd, 0, 1, &sci); } else -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ { const VkRect2D sci = { { 0, 0 }, @@ -2851,7 +2550,7 @@ void Pass::build_commands( }, }; vkCmdSetScissor(cmd, 0, 1, &sci); - } + } } vkCmdDraw(cmd, 4, 1, 0, 0); @@ -2893,10 +2592,10 @@ Framebuffer::Framebuffer( unsigned max_levels) : size(max_size), format(format), - max_levels(std::max(max_levels, 1u)), memory_properties(mem_props), device(device) { + max_levels = MAX(max_levels, 1u); RARCH_LOG("[Vulkan filter chain]: Creating framebuffer %ux%u (max %u level(s)).\n", max_size.width, max_size.height, max_levels); vulkan_initialize_render_pass(device, format, &render_pass); @@ -2910,6 +2609,7 @@ void Framebuffer::init(DeferredDisposer *disposer) VkImageCreateInfo info; VkMemoryAllocateInfo alloc; VkImageViewCreateInfo view_info; + size_t _y = glslang_num_miplevels(size.width, size.height); info.sType = VK_STRUCTURE_TYPE_IMAGE_CREATE_INFO; info.pNext = NULL; @@ -2919,8 +2619,7 @@ void Framebuffer::init(DeferredDisposer *disposer) info.extent.width = size.width; info.extent.height = size.height; info.extent.depth = 1; - info.mipLevels = std::min(max_levels, - glslang_num_miplevels(size.width, size.height)); + info.mipLevels = MIN(max_levels, _y); info.arrayLayers = 1; info.samples = VK_SAMPLE_COUNT_1_BIT; info.tiling = VK_IMAGE_TILING_OPTIMAL; @@ -3220,8 +2919,8 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( else { pass_info.source_filter = - pass->filter == RARCH_FILTER_LINEAR - ? GLSLANG_FILTER_CHAIN_LINEAR + pass->filter == RARCH_FILTER_LINEAR + ? GLSLANG_FILTER_CHAIN_LINEAR : GLSLANG_FILTER_CHAIN_NEAREST; } pass_info.address = rarch_wrap_to_address(pass->wrap); @@ -3234,9 +2933,9 @@ vulkan_filter_chain_t *vulkan_filter_chain_create_from_preset( if (next_pass && next_pass->mipmap) pass_info.max_levels = ~0u; - pass_info.mip_filter = + pass_info.mip_filter = (pass->filter != RARCH_FILTER_NEAREST && pass_info.max_levels > 1) - ? GLSLANG_FILTER_CHAIN_LINEAR + ? GLSLANG_FILTER_CHAIN_LINEAR : GLSLANG_FILTER_CHAIN_NEAREST; bool explicit_format = output.meta.rt_format != SLANG_FORMAT_UNKNOWN; @@ -3473,7 +3172,7 @@ void vulkan_filter_chain_set_simulate_scanline( { chain->set_simulate_scanline(simulate_scanline); } -#endif // VULKAN_ROLLING_SCANLINE_SIMULATION +#endif /* VULKAN_ROLLING_SCANLINE_SIMULATION */ void vulkan_filter_chain_set_frame_direction( vulkan_filter_chain_t *chain, diff --git a/gfx/drivers_shader/slang_process.cpp b/gfx/drivers_shader/slang_process.cpp index f4e3d5f9a92..f06536697d4 100644 --- a/gfx/drivers_shader/slang_process.cpp +++ b/gfx/drivers_shader/slang_process.cpp @@ -31,10 +31,6 @@ #include "../../verbosity.h" -#ifdef HAVE_SPIRV_CROSS -using namespace spirv_cross; -#endif - template static const char *get_semantic_name( const std::unordered_map* map, @@ -49,10 +45,10 @@ static const char *get_semantic_name( } static bool slang_process_reflection( - const Compiler* vs_compiler, - const Compiler* ps_compiler, - const ShaderResources& vs_resources, - const ShaderResources& ps_resources, + const spirv_cross::Compiler* vs_compiler, + const spirv_cross::Compiler* ps_compiler, + const spirv_cross::ShaderResources& vs_resources, + const spirv_cross::ShaderResources& ps_resources, video_shader* shader_info, unsigned pass_number, const semantics_map_t* map, @@ -423,10 +419,10 @@ bool slang_process( const semantics_map_t* semantics_map, pass_semantics_t* out) { - glslang_output output; - Compiler* vs_compiler = NULL; - Compiler* ps_compiler = NULL; - video_shader_pass& pass = shader_info->pass[pass_number]; + glslang_output output; + spirv_cross::Compiler *vs_compiler = NULL; + spirv_cross::Compiler *ps_compiler = NULL; + video_shader_pass &pass = shader_info->pass[pass_number]; if (!glslang_compile_shader(pass.source.path, &output)) return false; @@ -454,8 +450,8 @@ bool slang_process( try { - ShaderResources vs_resources; - ShaderResources ps_resources; + spirv_cross::ShaderResources vs_resources; + spirv_cross::ShaderResources ps_resources; std::string vs_code; std::string ps_code; @@ -464,19 +460,19 @@ bool slang_process( case RARCH_SHADER_HLSL: case RARCH_SHADER_CG: #ifdef HAVE_HLSL - vs_compiler = new CompilerHLSL(output.vertex); - ps_compiler = new CompilerHLSL(output.fragment); + vs_compiler = new spirv_cross::CompilerHLSL(output.vertex); + ps_compiler = new spirv_cross::CompilerHLSL(output.fragment); #endif break; case RARCH_SHADER_METAL: - vs_compiler = new CompilerMSL(output.vertex); - ps_compiler = new CompilerMSL(output.fragment); + vs_compiler = new spirv_cross::CompilerMSL(output.vertex); + ps_compiler = new spirv_cross::CompilerMSL(output.fragment); break; default: - vs_compiler = new CompilerGLSL(output.vertex); - ps_compiler = new CompilerGLSL(output.fragment); + vs_compiler = new spirv_cross::CompilerGLSL(output.vertex); + ps_compiler = new spirv_cross::CompilerGLSL(output.fragment); break; } @@ -505,10 +501,10 @@ bool slang_process( case RARCH_SHADER_CG: #ifdef HAVE_HLSL { - CompilerHLSL::Options options; - CompilerHLSL* vs = (CompilerHLSL*)vs_compiler; - CompilerHLSL* ps = (CompilerHLSL*)ps_compiler; - options.shader_model = version; + spirv_cross::CompilerHLSL::Options options; + spirv_cross::CompilerHLSL *vs = (spirv_cross::CompilerHLSL*)vs_compiler; + spirv_cross::CompilerHLSL *ps = (spirv_cross::CompilerHLSL*)ps_compiler; + options.shader_model = version; vs->set_hlsl_options(options); ps->set_hlsl_options(options); vs_code = vs->compile(); @@ -518,38 +514,44 @@ bool slang_process( break; case RARCH_SHADER_METAL: { - CompilerMSL::Options options; - CompilerMSL* vs = (CompilerMSL*)vs_compiler; - CompilerMSL* ps = (CompilerMSL*)ps_compiler; - options.msl_version = version; + spirv_cross::CompilerMSL::Options options; + spirv_cross::CompilerMSL *vs = (spirv_cross::CompilerMSL*)vs_compiler; + spirv_cross::CompilerMSL *ps = (spirv_cross::CompilerMSL*)ps_compiler; + options.msl_version = version; vs->set_msl_options(options); ps->set_msl_options(options); - const auto remap_push_constant = [](CompilerMSL *comp, - const ShaderResources &resources) { - for (const Resource& resource : resources.push_constant_buffers) + const auto remap_push_constant = [](spirv_cross::CompilerMSL *comp, + const spirv_cross::ShaderResources &resources) { + for (const spirv_cross::Resource& resource : resources.push_constant_buffers) { /* Explicit 1:1 mapping for bindings. */ - MSLResourceBinding binding = {}; + spirv_cross::MSLResourceBinding binding; binding.stage = comp->get_execution_model(); - binding.desc_set = kPushConstDescSet; - binding.binding = kPushConstBinding; + binding.desc_set = spirv_cross::kPushConstDescSet; + binding.binding = spirv_cross::kPushConstBinding; /* Use earlier decoration override. */ + binding.basetype = spirv_cross::SPIRType::Unknown; + binding.count = 0; binding.msl_buffer = comp->get_decoration( resource.id, spv::DecorationBinding); + binding.msl_texture = 0; + binding.msl_sampler = 0; comp->add_msl_resource_binding(binding); } }; - const auto remap_generic_resource = [](CompilerMSL *comp, - const SmallVector &resources) { - for (const Resource& resource : resources) + const auto remap_generic_resource = [](spirv_cross::CompilerMSL *comp, + const spirv_cross::SmallVector &resources) { + for (const spirv_cross::Resource& resource : resources) { /* Explicit 1:1 mapping for bindings. */ - MSLResourceBinding binding = {}; + spirv_cross::MSLResourceBinding binding; binding.stage = comp->get_execution_model(); binding.desc_set = comp->get_decoration( resource.id, spv::DecorationDescriptorSet); + binding.basetype = spirv_cross::SPIRType::Unknown; + binding.count = 0; /* Use existing decoration override. */ uint32_t msl_binding = comp->get_decoration( @@ -575,10 +577,10 @@ bool slang_process( break; case RARCH_SHADER_GLSL: { - CompilerGLSL::Options options; - CompilerGLSL* vs = (CompilerGLSL*)vs_compiler; - CompilerGLSL* ps = (CompilerGLSL*)ps_compiler; - options.version = version; + spirv_cross::CompilerGLSL::Options options; + spirv_cross::CompilerGLSL *vs = (spirv_cross::CompilerGLSL*)vs_compiler; + spirv_cross::CompilerGLSL *ps = (spirv_cross::CompilerGLSL*)ps_compiler; + options.version = version; ps->set_common_options(options); vs->set_common_options(options); @@ -598,7 +600,6 @@ bool slang_process( vs_resources, ps_resources, shader_info, pass_number, semantics_map, out)) goto error; - } catch (const std::exception& e) { diff --git a/gfx/drivers_shader/slang_reflection.cpp b/gfx/drivers_shader/slang_reflection.cpp index 5bc5313312b..b762830ad05 100644 --- a/gfx/drivers_shader/slang_reflection.cpp +++ b/gfx/drivers_shader/slang_reflection.cpp @@ -20,12 +20,10 @@ #include #include #include +#include #include "glslang_util.h" #include "../../verbosity.h" -using namespace std; -using namespace spirv_cross; - static const char *texture_semantic_names[] = { "Original", "Source", @@ -173,7 +171,7 @@ static bool set_ubo_float_parameter_offset( } } - if ( (sem.num_components != num_components) && + if ( (sem.num_components != num_components) && (sem.uniform || sem.push_constant)) { RARCH_ERR("[slang]: Vertex and fragment have different " @@ -213,7 +211,7 @@ static bool set_ubo_offset( } - if ( (sem.num_components != num_components) && + if ( (sem.num_components != num_components) && (sem.uniform || sem.push_constant)) { RARCH_ERR("[slang]: Vertex and fragment have different" @@ -230,54 +228,73 @@ static bool set_ubo_offset( return true; } -static bool validate_type_for_semantic(const SPIRType &type, slang_semantic sem) +static bool validate_type_for_semantic(const spirv_cross::SPIRType &type, slang_semantic sem) { if (!type.array.empty()) return false; - if (type.basetype != SPIRType::Float && type.basetype != SPIRType::Int && type.basetype != SPIRType::UInt) + if ( type.basetype != spirv_cross::SPIRType::Float + && type.basetype != spirv_cross::SPIRType::Int + && type.basetype != spirv_cross::SPIRType::UInt) return false; switch (sem) { /* mat4 */ case SLANG_SEMANTIC_MVP: - return type.basetype == SPIRType::Float && type.vecsize == 4 && type.columns == 4; + return + type.basetype == spirv_cross::SPIRType::Float + && type.vecsize == 4 + && type.columns == 4; /* uint */ case SLANG_SEMANTIC_FRAME_COUNT: - return type.basetype == SPIRType::UInt && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::UInt + && type.vecsize == 1 + && type.columns == 1; /* int */ case SLANG_SEMANTIC_TOTAL_SUBFRAMES: - return type.basetype == SPIRType::UInt && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::UInt + && type.vecsize == 1 + && type.columns == 1; /* int */ case SLANG_SEMANTIC_CURRENT_SUBFRAME: - return type.basetype == SPIRType::UInt && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::UInt + && type.vecsize == 1 + && type.columns == 1; /* int */ case SLANG_SEMANTIC_FRAME_DIRECTION: - return type.basetype == SPIRType::Int && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::Int + && type.vecsize == 1 + && type.columns == 1; /* uint */ case SLANG_SEMANTIC_ROTATION: - return type.basetype == SPIRType::UInt && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::UInt + && type.vecsize == 1 + && type.columns == 1; /* float */ case SLANG_SEMANTIC_FLOAT_PARAMETER: - return type.basetype == SPIRType::Float && type.vecsize == 1 && type.columns == 1; + return type.basetype == spirv_cross::SPIRType::Float + && type.vecsize == 1 + && type.columns == 1; /* vec4 */ default: - return type.basetype == SPIRType::Float && type.vecsize == 4 && type.columns == 1; + break; } + return type.basetype == spirv_cross::SPIRType::Float + && type.vecsize == 4 + && type.columns == 1; } -static bool validate_type_for_texture_semantic(const SPIRType &type) +static bool validate_type_for_texture_semantic(const spirv_cross::SPIRType &type) { - if (!type.array.empty()) - return false; - return (type.basetype == SPIRType::Float) && - (type.vecsize == 4) && - (type.columns == 1); + return (type.array.empty()) + && (type.basetype == spirv_cross::SPIRType::Float) + && (type.vecsize == 4) + && (type.columns == 1); } static bool add_active_buffer_ranges( - const Compiler &compiler, - const Resource &resource, + const spirv_cross::Compiler &compiler, + const spirv_cross::Resource &resource, slang_reflection *reflection, bool push_constant) { @@ -291,7 +308,7 @@ static bool add_active_buffer_ranges( unsigned tex_sem_index = 0; const std::string &name = compiler.get_member_name( resource.base_type_id, ranges[i].index); - const SPIRType &type = compiler.get_type( + const spirv_cross::SPIRType &type = compiler.get_type( compiler.get_type(resource.base_type_id).member_types[ ranges[i].index]); slang_semantic sem = slang_uniform_name_to_semantic( @@ -369,10 +386,10 @@ slang_reflection::slang_reflection() } bool slang_reflect( - const Compiler &vertex_compiler, - const Compiler &fragment_compiler, - const ShaderResources &vertex, - const ShaderResources &fragment, + const spirv_cross::Compiler &vertex_compiler, + const spirv_cross::Compiler &fragment_compiler, + const spirv_cross::ShaderResources &vertex, + const spirv_cross::ShaderResources &fragment, slang_reflection *reflection) { uint32_t location_mask = 0; @@ -473,11 +490,11 @@ bool slang_reflect( return false; } - unsigned vertex_ubo_binding = vertex_ubo - ? vertex_compiler.get_decoration(vertex_ubo, spv::DecorationBinding) + unsigned vertex_ubo_binding = vertex_ubo + ? vertex_compiler.get_decoration(vertex_ubo, spv::DecorationBinding) : -1u; - unsigned fragment_ubo_binding = fragment_ubo - ? fragment_compiler.get_decoration(fragment_ubo, spv::DecorationBinding) + unsigned fragment_ubo_binding = fragment_ubo + ? fragment_compiler.get_decoration(fragment_ubo, spv::DecorationBinding) : -1u; bool has_ubo = vertex_ubo || fragment_ubo; @@ -490,7 +507,7 @@ bool slang_reflect( } unsigned ubo_binding = (vertex_ubo_binding != -1u) - ? vertex_ubo_binding + ? vertex_ubo_binding : fragment_ubo_binding; if (has_ubo && ubo_binding >= SLANG_NUM_BINDINGS) @@ -507,43 +524,47 @@ bool slang_reflect( if (vertex_ubo) { + size_t _y; reflection->ubo_stage_mask |= SLANG_STAGE_VERTEX_MASK; - reflection->ubo_size = max(reflection->ubo_size, - vertex_compiler.get_declared_struct_size( + _y = vertex_compiler.get_declared_struct_size( vertex_compiler.get_type( - vertex.uniform_buffers[0].base_type_id))); + vertex.uniform_buffers[0].base_type_id)); + reflection->ubo_size = MAX(reflection->ubo_size, _y); } if (fragment_ubo) { + size_t _y; reflection->ubo_stage_mask |= SLANG_STAGE_FRAGMENT_MASK; - reflection->ubo_size = max(reflection->ubo_size, - fragment_compiler.get_declared_struct_size( + _y = fragment_compiler.get_declared_struct_size( fragment_compiler.get_type( - fragment.uniform_buffers[0].base_type_id))); + fragment.uniform_buffers[0].base_type_id)); + reflection->ubo_size = MAX(reflection->ubo_size, _y); } if (vertex_push) { + size_t _y; reflection->push_constant_stage_mask |= SLANG_STAGE_VERTEX_MASK; - reflection->push_constant_size = max( - reflection->push_constant_size, - vertex_compiler.get_declared_struct_size( + _y = vertex_compiler.get_declared_struct_size( vertex_compiler.get_type( - vertex.push_constant_buffers[0].base_type_id))); + vertex.push_constant_buffers[0].base_type_id)); + reflection->push_constant_size = MAX( + reflection->push_constant_size, _y); } if (fragment_push) { + size_t _y; reflection->push_constant_stage_mask |= SLANG_STAGE_FRAGMENT_MASK; - reflection->push_constant_size = max( - reflection->push_constant_size, - fragment_compiler.get_declared_struct_size( + _y = fragment_compiler.get_declared_struct_size( fragment_compiler.get_type( - fragment.push_constant_buffers[0].base_type_id))); + fragment.push_constant_buffers[0].base_type_id)); + reflection->push_constant_size = MAX( + reflection->push_constant_size, _y); } - /* Validate push constant size against Vulkan's + /* Validate push constant size against Vulkan's * minimum spec to avoid cross-vendor issues. */ if (reflection->push_constant_size > 128) { @@ -615,13 +636,13 @@ bool slang_reflect( { RARCH_ERR("[slang]: Texture name '%s' not found in semantic map, " "Probably the texture name or pass alias is not defined " - "in the preset (Non-semantic textures not supported yet)\n", + "in the preset (Non-semantic textures not supported yet)\n", fragment.sampled_images[i].name.c_str()); return false; } resize_minimum(reflection->semantic_textures[index], array_index + 1); - slang_texture_semantic_meta &semantic = + slang_texture_semantic_meta &semantic = reflection->semantic_textures[index][array_index]; semantic.binding = binding; semantic.stage_mask = SLANG_STAGE_FRAGMENT_MASK; @@ -727,11 +748,11 @@ bool slang_reflect_spirv(const std::vector &vertex, { try { - Compiler vertex_compiler(vertex); - Compiler fragment_compiler(fragment); + spirv_cross::Compiler vertex_compiler(vertex); + spirv_cross::Compiler fragment_compiler(fragment); spirv_cross::ShaderResources vertex_resources = vertex_compiler.get_shader_resources(); - spirv_cross::ShaderResources + spirv_cross::ShaderResources fragment_resources = fragment_compiler.get_shader_resources(); if (!slang_reflect(vertex_compiler, fragment_compiler, diff --git a/gfx/font_driver.c b/gfx/font_driver.c index 5ba03ddb905..d0b7c3cf379 100644 --- a/gfx/font_driver.c +++ b/gfx/font_driver.c @@ -654,7 +654,7 @@ static INLINE unsigned font_get_arabic_replacement( next_connected = !!arabic_shape_map[next_id][1]; } - if ((result = + if ((result = arabic_shape_map[id][prev_connected | (next_connected << 1)])) return result; @@ -669,7 +669,7 @@ static char* font_driver_reshape_msg(const char* msg, unsigned char *buffer, siz size_t msg_size = (strlen(msg) * 2) + 1; /* Fallback to heap allocated buffer if the buffer is too small */ /* worst case transformations are 2 bytes to 4 bytes -- aliaspider */ - unsigned char* dst_buffer = (buffer_size < msg_size) + unsigned char* dst_buffer = (buffer_size < msg_size) ? (unsigned char*)malloc(msg_size) : buffer; unsigned char *dst = (unsigned char*)dst_buffer; @@ -733,9 +733,9 @@ static char* font_driver_reshape_msg(const char* msg, unsigned char *buffer, siz { reverse = false; src++; - while ( IS_MBCONT(src) - || IS_RTL(src) - || IS_DIR_NEUTRAL(src) + while ( IS_MBCONT(src) + || IS_RTL(src) + || IS_DIR_NEUTRAL(src) || is_misc_ws(src)) src++; } @@ -745,7 +745,7 @@ static char* font_driver_reshape_msg(const char* msg, unsigned char *buffer, siz if (IS_RTL(src)) { reverse = true; - while ( IS_MBCONT(src) + while ( IS_MBCONT(src) || IS_RTL(src) || IS_DIR_NEUTRAL(src) || is_misc_ws(src)) @@ -943,7 +943,7 @@ void font_driver_init_osd( void font_driver_free_osd(void) { if (video_font_driver) - font_driver_free(video_font_driver); + font_driver_free((font_data_t*)video_font_driver); video_font_driver = NULL; } diff --git a/gfx/include/dxsdk/d3d11.h b/gfx/include/dxsdk/d3d11.h index 40c96ce5266..3d700565b93 100644 --- a/gfx/include/dxsdk/d3d11.h +++ b/gfx/include/dxsdk/d3d11.h @@ -1012,12 +1012,6 @@ extern "C"{ /* Direct3D errors are now found in winerror.h */ #define MAKE_D3D11_HRESULT( code ) MAKE_HRESULT( 1, _FACD3D11, code ) #define MAKE_D3D11_STATUS( code ) MAKE_HRESULT( 0, _FACD3D11, code ) -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_DEFAULT {}; -extern const DECLSPEC_SELECTANY CD3D11_DEFAULT D3D11_DEFAULT; -extern "C"{ -#endif typedef enum D3D11_INPUT_CLASSIFICATION { @@ -1077,17 +1071,6 @@ typedef struct D3D11_VIEWPORT FLOAT MaxDepth; } D3D11_VIEWPORT; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -inline bool operator==( const D3D11_VIEWPORT& l, const D3D11_VIEWPORT& r ) -{ - return l.TopLeftX == r.TopLeftX && l.TopLeftY == r.TopLeftY && l.Width == r.Width && - l.Height == r.Height && l.MinDepth == r.MinDepth && l.MaxDepth == r.MaxDepth; -} -inline bool operator!=( const D3D11_VIEWPORT& l, const D3D11_VIEWPORT& r ) -{ return !( l == r ); } -extern "C"{ -#endif typedef struct D3D11_DRAW_INSTANCED_INDIRECT_ARGS { UINT VertexCountPerInstance; @@ -1239,38 +1222,6 @@ enum D3D11_CLEAR_FLAG typedef RECT D3D11_RECT; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RECT : public D3D11_RECT -{ - CD3D11_RECT() - {} - explicit CD3D11_RECT( const D3D11_RECT& o ) : - D3D11_RECT( o ) - {} - explicit CD3D11_RECT( - LONG Left, - LONG Top, - LONG Right, - LONG Bottom ) - { - left = Left; - top = Top; - right = Right; - bottom = Bottom; - } - ~CD3D11_RECT() {} - operator const D3D11_RECT&() const { return *this; } -}; -inline bool operator==( const D3D11_RECT& l, const D3D11_RECT& r ) -{ - return l.left == r.left && l.top == r.top && - l.right == r.right && l.bottom == r.bottom; -} -inline bool operator!=( const D3D11_RECT& l, const D3D11_RECT& r ) -{ return !( l == r ); } -extern "C"{ -#endif typedef struct D3D11_BOX { UINT left; @@ -1281,43 +1232,6 @@ typedef struct D3D11_BOX UINT back; } D3D11_BOX; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_BOX : public D3D11_BOX -{ - CD3D11_BOX() - {} - explicit CD3D11_BOX( const D3D11_BOX& o ) : - D3D11_BOX( o ) - {} - explicit CD3D11_BOX( - LONG Left, - LONG Top, - LONG Front, - LONG Right, - LONG Bottom, - LONG Back ) - { - left = Left; - top = Top; - front = Front; - right = Right; - bottom = Bottom; - back = Back; - } - ~CD3D11_BOX() {} - operator const D3D11_BOX&() const { return *this; } -}; -inline bool operator==( const D3D11_BOX& l, const D3D11_BOX& r ) -{ - return l.left == r.left && l.top == r.top && l.front == r.front && - l.right == r.right && l.bottom == r.bottom && l.back == r.back; -} -inline bool operator!=( const D3D11_BOX& l, const D3D11_BOX& r ) -{ return !( l == r ); } -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0000_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0000_v0_0_s_ifspec; @@ -1504,65 +1418,6 @@ typedef struct D3D11_DEPTH_STENCIL_DESC D3D11_DEPTH_STENCILOP_DESC BackFace; } D3D11_DEPTH_STENCIL_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_DEPTH_STENCIL_DESC : public D3D11_DEPTH_STENCIL_DESC -{ - CD3D11_DEPTH_STENCIL_DESC() - {} - explicit CD3D11_DEPTH_STENCIL_DESC( const D3D11_DEPTH_STENCIL_DESC& o ) : - D3D11_DEPTH_STENCIL_DESC( o ) - {} - explicit CD3D11_DEPTH_STENCIL_DESC( CD3D11_DEFAULT ) - { - DepthEnable = TRUE; - DepthWriteMask = D3D11_DEPTH_WRITE_MASK_ALL; - DepthFunc = D3D11_COMPARISON_LESS; - StencilEnable = FALSE; - StencilReadMask = D3D11_DEFAULT_STENCIL_READ_MASK; - StencilWriteMask = D3D11_DEFAULT_STENCIL_WRITE_MASK; - const D3D11_DEPTH_STENCILOP_DESC defaultStencilOp = - { D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_STENCIL_OP_KEEP, D3D11_COMPARISON_ALWAYS }; - FrontFace = defaultStencilOp; - BackFace = defaultStencilOp; - } - explicit CD3D11_DEPTH_STENCIL_DESC( - BOOL depthEnable, - D3D11_DEPTH_WRITE_MASK depthWriteMask, - D3D11_COMPARISON_FUNC depthFunc, - BOOL stencilEnable, - UINT8 stencilReadMask, - UINT8 stencilWriteMask, - D3D11_STENCIL_OP frontStencilFailOp, - D3D11_STENCIL_OP frontStencilDepthFailOp, - D3D11_STENCIL_OP frontStencilPassOp, - D3D11_COMPARISON_FUNC frontStencilFunc, - D3D11_STENCIL_OP backStencilFailOp, - D3D11_STENCIL_OP backStencilDepthFailOp, - D3D11_STENCIL_OP backStencilPassOp, - D3D11_COMPARISON_FUNC backStencilFunc ) - { - DepthEnable = depthEnable; - DepthWriteMask = depthWriteMask; - DepthFunc = depthFunc; - StencilEnable = stencilEnable; - StencilReadMask = stencilReadMask; - StencilWriteMask = stencilWriteMask; - FrontFace.StencilFailOp = frontStencilFailOp; - FrontFace.StencilDepthFailOp = frontStencilDepthFailOp; - FrontFace.StencilPassOp = frontStencilPassOp; - FrontFace.StencilFunc = frontStencilFunc; - BackFace.StencilFailOp = backStencilFailOp; - BackFace.StencilDepthFailOp = backStencilDepthFailOp; - BackFace.StencilPassOp = backStencilPassOp; - BackFace.StencilFunc = backStencilFunc; - } - ~CD3D11_DEPTH_STENCIL_DESC() {} - operator const D3D11_DEPTH_STENCIL_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0001_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0001_v0_0_s_ifspec; @@ -1743,37 +1598,6 @@ typedef struct D3D11_BLEND_DESC D3D11_RENDER_TARGET_BLEND_DESC RenderTarget[ 8 ]; } D3D11_BLEND_DESC; -/* Note, the array size for RenderTarget[] above is D3D11_SIMULTANEOUS_RENDERTARGET_COUNT. - IDL processing/generation of this header replaces the define; this comment is merely explaining what happened. */ -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_BLEND_DESC : public D3D11_BLEND_DESC -{ - CD3D11_BLEND_DESC() - {} - explicit CD3D11_BLEND_DESC( const D3D11_BLEND_DESC& o ) : - D3D11_BLEND_DESC( o ) - {} - explicit CD3D11_BLEND_DESC( CD3D11_DEFAULT ) - { - AlphaToCoverageEnable = FALSE; - IndependentBlendEnable = FALSE; - const D3D11_RENDER_TARGET_BLEND_DESC defaultRenderTargetBlendDesc = - { - FALSE, - D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, - D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, - D3D11_COLOR_WRITE_ENABLE_ALL, - }; - for (UINT i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) - RenderTarget[ i ] = defaultRenderTargetBlendDesc; - } - ~CD3D11_BLEND_DESC() {} - operator const D3D11_BLEND_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0002_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0002_v0_0_s_ifspec; @@ -1907,57 +1731,6 @@ typedef struct D3D11_RASTERIZER_DESC BOOL AntialiasedLineEnable; } D3D11_RASTERIZER_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RASTERIZER_DESC : public D3D11_RASTERIZER_DESC -{ - CD3D11_RASTERIZER_DESC() - {} - explicit CD3D11_RASTERIZER_DESC( const D3D11_RASTERIZER_DESC& o ) : - D3D11_RASTERIZER_DESC( o ) - {} - explicit CD3D11_RASTERIZER_DESC( CD3D11_DEFAULT ) - { - FillMode = D3D11_FILL_SOLID; - CullMode = D3D11_CULL_BACK; - FrontCounterClockwise = FALSE; - DepthBias = D3D11_DEFAULT_DEPTH_BIAS; - DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP; - SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; - DepthClipEnable = TRUE; - ScissorEnable = FALSE; - MultisampleEnable = FALSE; - AntialiasedLineEnable = FALSE; - } - explicit CD3D11_RASTERIZER_DESC( - D3D11_FILL_MODE fillMode, - D3D11_CULL_MODE cullMode, - BOOL frontCounterClockwise, - INT depthBias, - FLOAT depthBiasClamp, - FLOAT slopeScaledDepthBias, - BOOL depthClipEnable, - BOOL scissorEnable, - BOOL multisampleEnable, - BOOL antialiasedLineEnable ) - { - FillMode = fillMode; - CullMode = cullMode; - FrontCounterClockwise = frontCounterClockwise; - DepthBias = depthBias; - DepthBiasClamp = depthBiasClamp; - SlopeScaledDepthBias = slopeScaledDepthBias; - DepthClipEnable = depthClipEnable; - ScissorEnable = scissorEnable; - MultisampleEnable = multisampleEnable; - AntialiasedLineEnable = antialiasedLineEnable; - } - ~CD3D11_RASTERIZER_DESC() {} - operator const D3D11_RASTERIZER_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0003_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0003_v0_0_s_ifspec; @@ -2077,12 +1850,6 @@ EXTERN_C const IID IID_ID3D11RasterizerState; /* interface __MIDL_itf_d3d11_0000_0004 */ /* [local] */ -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -inline UINT D3D11CalcSubresource( UINT MipSlice, UINT ArraySlice, UINT MipLevels ) -{ return MipSlice + ArraySlice * MipLevels; } -extern "C"{ -#endif typedef struct D3D11_SUBRESOURCE_DATA { const void *pSysMem; @@ -2246,36 +2013,6 @@ typedef struct D3D11_BUFFER_DESC UINT StructureByteStride; } D3D11_BUFFER_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_BUFFER_DESC : public D3D11_BUFFER_DESC -{ - CD3D11_BUFFER_DESC() - {} - explicit CD3D11_BUFFER_DESC( const D3D11_BUFFER_DESC& o ) : - D3D11_BUFFER_DESC( o ) - {} - explicit CD3D11_BUFFER_DESC( - UINT byteWidth, - UINT bindFlags, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags = 0, - UINT miscFlags = 0, - UINT structureByteStride = 0 ) - { - ByteWidth = byteWidth; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags ; - MiscFlags = miscFlags; - StructureByteStride = structureByteStride; - } - ~CD3D11_BUFFER_DESC() {} - operator const D3D11_BUFFER_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0005_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0005_v0_0_s_ifspec; @@ -2429,40 +2166,6 @@ typedef struct D3D11_TEXTURE1D_DESC UINT MiscFlags; } D3D11_TEXTURE1D_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_TEXTURE1D_DESC : public D3D11_TEXTURE1D_DESC -{ - CD3D11_TEXTURE1D_DESC() - {} - explicit CD3D11_TEXTURE1D_DESC( const D3D11_TEXTURE1D_DESC& o ) : - D3D11_TEXTURE1D_DESC( o ) - {} - explicit CD3D11_TEXTURE1D_DESC( - DXGI_FORMAT format, - UINT width, - UINT arraySize = 1, - UINT mipLevels = 0, - UINT bindFlags = D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags= 0, - UINT miscFlags = 0 ) - { - Width = width; - MipLevels = mipLevels; - ArraySize = arraySize; - Format = format; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags; - MiscFlags = miscFlags; - } - ~CD3D11_TEXTURE1D_DESC() {} - operator const D3D11_TEXTURE1D_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0006_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0006_v0_0_s_ifspec; @@ -2618,46 +2321,6 @@ typedef struct D3D11_TEXTURE2D_DESC UINT MiscFlags; } D3D11_TEXTURE2D_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_TEXTURE2D_DESC : public D3D11_TEXTURE2D_DESC -{ - CD3D11_TEXTURE2D_DESC() - {} - explicit CD3D11_TEXTURE2D_DESC( const D3D11_TEXTURE2D_DESC& o ) : - D3D11_TEXTURE2D_DESC( o ) - {} - explicit CD3D11_TEXTURE2D_DESC( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT arraySize = 1, - UINT mipLevels = 0, - UINT bindFlags = D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags = 0, - UINT sampleCount = 1, - UINT sampleQuality = 0, - UINT miscFlags = 0 ) - { - Width = width; - Height = height; - MipLevels = mipLevels; - ArraySize = arraySize; - Format = format; - SampleDesc.Count = sampleCount; - SampleDesc.Quality = sampleQuality; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags; - MiscFlags = miscFlags; - } - ~CD3D11_TEXTURE2D_DESC() {} - operator const D3D11_TEXTURE2D_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0007_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0007_v0_0_s_ifspec; @@ -2812,42 +2475,6 @@ typedef struct D3D11_TEXTURE3D_DESC UINT MiscFlags; } D3D11_TEXTURE3D_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_TEXTURE3D_DESC : public D3D11_TEXTURE3D_DESC -{ - CD3D11_TEXTURE3D_DESC() - {} - explicit CD3D11_TEXTURE3D_DESC( const D3D11_TEXTURE3D_DESC& o ) : - D3D11_TEXTURE3D_DESC( o ) - {} - explicit CD3D11_TEXTURE3D_DESC( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT depth, - UINT mipLevels = 0, - UINT bindFlags = D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags = 0, - UINT miscFlags = 0 ) - { - Width = width; - Height = height; - Depth = depth; - MipLevels = mipLevels; - Format = format; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags; - MiscFlags = miscFlags; - } - ~CD3D11_TEXTURE3D_DESC() {} - operator const D3D11_TEXTURE3D_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0008_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0008_v0_0_s_ifspec; @@ -3225,213 +2852,6 @@ typedef struct D3D11_SHADER_RESOURCE_VIEW_DESC } ; } D3D11_SHADER_RESOURCE_VIEW_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_SHADER_RESOURCE_VIEW_DESC : public D3D11_SHADER_RESOURCE_VIEW_DESC -{ - CD3D11_SHADER_RESOURCE_VIEW_DESC() - {} - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( const D3D11_SHADER_RESOURCE_VIEW_DESC& o ) : - D3D11_SHADER_RESOURCE_VIEW_DESC( o ) - {} - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, // FirstElement for BUFFER - UINT mipLevels = -1, // NumElements for BUFFER - UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY - UINT arraySize = -1, // NumCubes for TEXTURECUBEARRAY - UINT flags = 0 ) // BUFFEREX only - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_BUFFER: - Buffer.FirstElement = mostDetailedMip; - Buffer.NumElements = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1D: - Texture1D.MostDetailedMip = mostDetailedMip; - Texture1D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MostDetailedMip = mostDetailedMip; - Texture1DArray.MipLevels = mipLevels; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE2D: - Texture2D.MostDetailedMip = mostDetailedMip; - Texture2D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MostDetailedMip = mostDetailedMip; - Texture2DArray.MipLevels = mipLevels; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE3D: - Texture3D.MostDetailedMip = mostDetailedMip; - Texture3D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBE: - TextureCube.MostDetailedMip = mostDetailedMip; - TextureCube.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: - TextureCubeArray.MostDetailedMip = mostDetailedMip; - TextureCubeArray.MipLevels = mipLevels; - TextureCubeArray.First2DArrayFace = firstArraySlice; - TextureCubeArray.NumCubes = arraySize; - break; - case D3D11_SRV_DIMENSION_BUFFEREX: - BufferEx.FirstElement = mostDetailedMip; - BufferEx.NumElements = mipLevels; - BufferEx.Flags = flags; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements, - UINT flags = 0 ) - { - Format = format; - ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX; - BufferEx.FirstElement = firstElement; - BufferEx.NumElements = numElements; - BufferEx.Flags = flags; - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( - _In_ ID3D11Texture1D* pTex1D, - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || -1 == mipLevels || - (-1 == arraySize && D3D11_SRV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_TEXTURE1D: - Texture1D.MostDetailedMip = mostDetailedMip; - Texture1D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MostDetailedMip = mostDetailedMip; - Texture1DArray.MipLevels = mipLevels; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( - _In_ ID3D11Texture2D* pTex2D, - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1, - UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY - UINT arraySize = -1 ) // NumCubes for TEXTURECUBEARRAY - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == mipLevels && - D3D11_SRV_DIMENSION_TEXTURE2DMS != viewDimension && - D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY != viewDimension) || - (-1 == arraySize && - (D3D11_SRV_DIMENSION_TEXTURE2DARRAY == viewDimension || - D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY == viewDimension || - D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension))) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - if (-1 == arraySize) - { - arraySize = TexDesc.ArraySize - firstArraySlice; - if (D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension) arraySize /= 6; - } - } - Format = format; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_TEXTURE2D: - Texture2D.MostDetailedMip = mostDetailedMip; - Texture2D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MostDetailedMip = mostDetailedMip; - Texture2DArray.MipLevels = mipLevels; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBE: - TextureCube.MostDetailedMip = mostDetailedMip; - TextureCube.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: - TextureCubeArray.MostDetailedMip = mostDetailedMip; - TextureCubeArray.MipLevels = mipLevels; - TextureCubeArray.First2DArrayFace = firstArraySlice; - TextureCubeArray.NumCubes = arraySize; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1 ) - { - ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == mipLevels) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - } - Format = format; - Texture3D.MostDetailedMip = mostDetailedMip; - Texture3D.MipLevels = mipLevels; - } - ~CD3D11_SHADER_RESOURCE_VIEW_DESC() {} - operator const D3D11_SHADER_RESOURCE_VIEW_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0010_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0010_v0_0_s_ifspec; @@ -3632,167 +3052,6 @@ typedef struct D3D11_RENDER_TARGET_VIEW_DESC } ; } D3D11_RENDER_TARGET_VIEW_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RENDER_TARGET_VIEW_DESC : public D3D11_RENDER_TARGET_VIEW_DESC -{ - CD3D11_RENDER_TARGET_VIEW_DESC() - {} - explicit CD3D11_RENDER_TARGET_VIEW_DESC( const D3D11_RENDER_TARGET_VIEW_DESC& o ) : - D3D11_RENDER_TARGET_VIEW_DESC( o ) - {} - explicit CD3D11_RENDER_TARGET_VIEW_DESC( - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, // FirstElement for BUFFER - UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D - UINT arraySize = -1 ) // WSize for TEXTURE3D - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_BUFFER: - Buffer.FirstElement = mipSlice; - Buffer.NumElements = firstArraySlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE3D: - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstArraySlice; - Texture3D.WSize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements ) - { - Format = format; - ViewDimension = D3D11_RTV_DIMENSION_BUFFER; - Buffer.FirstElement = firstElement; - Buffer.NumElements = numElements; - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC( - _In_ ID3D11Texture1D* pTex1D, - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_RTV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC( - _In_ ID3D11Texture2D* pTex2D, - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && - (D3D11_RTV_DIMENSION_TEXTURE2DARRAY == viewDimension || - D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY == viewDimension))) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstWSlice = 0, - UINT wSize = -1 ) - { - ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == wSize) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == wSize) wSize = TexDesc.Depth - firstWSlice; - } - Format = format; - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstWSlice; - Texture3D.WSize = wSize; - } - ~CD3D11_RENDER_TARGET_VIEW_DESC() {} - operator const D3D11_RENDER_TARGET_VIEW_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0011_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0011_v0_0_s_ifspec; @@ -3920,153 +3179,6 @@ EXTERN_C const IID IID_ID3D11RenderTargetView; /* interface __MIDL_itf_d3d11_0000_0012 */ /* [local] */ -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_VIEWPORT : public D3D11_VIEWPORT -{ - CD3D11_VIEWPORT() - {} - explicit CD3D11_VIEWPORT( const D3D11_VIEWPORT& o ) : - D3D11_VIEWPORT( o ) - {} - explicit CD3D11_VIEWPORT( - FLOAT topLeftX, - FLOAT topLeftY, - FLOAT width, - FLOAT height, - FLOAT minDepth = D3D11_MIN_DEPTH, - FLOAT maxDepth = D3D11_MAX_DEPTH ) - { - TopLeftX = topLeftX; - TopLeftY = topLeftY; - Width = width; - Height = height; - MinDepth = minDepth; - MaxDepth = maxDepth; - } - explicit CD3D11_VIEWPORT( - _In_ ID3D11Buffer*, - _In_ ID3D11RenderTargetView* pRTView, - FLOAT topLeftX = 0.0f, - FLOAT minDepth = D3D11_MIN_DEPTH, - FLOAT maxDepth = D3D11_MAX_DEPTH ) - { - D3D11_RENDER_TARGET_VIEW_DESC RTVDesc; - pRTView->GetDesc( &RTVDesc ); - UINT NumElements = 0; - switch (RTVDesc.ViewDimension) - { - case D3D11_RTV_DIMENSION_BUFFER: - NumElements = RTVDesc.Buffer.NumElements; - break; - default: break; - } - TopLeftX = topLeftX; - TopLeftY = 0.0f; - Width = NumElements - topLeftX; - Height = 1.0f; - MinDepth = minDepth; - MaxDepth = maxDepth; - } - explicit CD3D11_VIEWPORT( - _In_ ID3D11Texture1D* pTex1D, - _In_ ID3D11RenderTargetView* pRTView, - FLOAT topLeftX = 0.0f, - FLOAT minDepth = D3D11_MIN_DEPTH, - FLOAT maxDepth = D3D11_MAX_DEPTH ) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - D3D11_RENDER_TARGET_VIEW_DESC RTVDesc; - pRTView->GetDesc( &RTVDesc ); - UINT MipSlice = 0; - switch (RTVDesc.ViewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE1D: - MipSlice = RTVDesc.Texture1D.MipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - MipSlice = RTVDesc.Texture1DArray.MipSlice; - break; - default: break; - } - const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice); - TopLeftX = topLeftX; - TopLeftY = 0.0f; - Width = (SubResourceWidth ? SubResourceWidth : 1) - topLeftX; - Height = 1.0f; - MinDepth = minDepth; - MaxDepth = maxDepth; - } - explicit CD3D11_VIEWPORT( - _In_ ID3D11Texture2D* pTex2D, - _In_ ID3D11RenderTargetView* pRTView, - FLOAT topLeftX = 0.0f, - FLOAT topLeftY = 0.0f, - FLOAT minDepth = D3D11_MIN_DEPTH, - FLOAT maxDepth = D3D11_MAX_DEPTH ) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - D3D11_RENDER_TARGET_VIEW_DESC RTVDesc; - pRTView->GetDesc( &RTVDesc ); - UINT MipSlice = 0; - switch (RTVDesc.ViewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE2D: - MipSlice = RTVDesc.Texture2D.MipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - MipSlice = RTVDesc.Texture2DArray.MipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - break; - default: break; - } - const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice); - const UINT SubResourceHeight = TexDesc.Height / (UINT( 1 ) << MipSlice); - TopLeftX = topLeftX; - TopLeftY = topLeftY; - Width = (SubResourceWidth ? SubResourceWidth : 1) - topLeftX; - Height = (SubResourceHeight ? SubResourceHeight : 1) - topLeftY; - MinDepth = minDepth; - MaxDepth = maxDepth; - } - explicit CD3D11_VIEWPORT( - _In_ ID3D11Texture3D* pTex3D, - _In_ ID3D11RenderTargetView* pRTView, - FLOAT topLeftX = 0.0f, - FLOAT topLeftY = 0.0f, - FLOAT minDepth = D3D11_MIN_DEPTH, - FLOAT maxDepth = D3D11_MAX_DEPTH ) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - D3D11_RENDER_TARGET_VIEW_DESC RTVDesc; - pRTView->GetDesc( &RTVDesc ); - UINT MipSlice = 0; - switch (RTVDesc.ViewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE3D: - MipSlice = RTVDesc.Texture3D.MipSlice; - break; - default: break; - } - const UINT SubResourceWidth = TexDesc.Width / (UINT( 1 ) << MipSlice); - const UINT SubResourceHeight = TexDesc.Height / (UINT( 1 ) << MipSlice); - TopLeftX = topLeftX; - TopLeftY = topLeftY; - Width = (SubResourceWidth ? SubResourceWidth : 1) - topLeftX; - Height = (SubResourceHeight ? SubResourceHeight : 1) - topLeftY; - MinDepth = minDepth; - MaxDepth = maxDepth; - } - ~CD3D11_VIEWPORT() {} - operator const D3D11_VIEWPORT&() const { return *this; } -}; -extern "C"{ -#endif typedef struct D3D11_TEX1D_DSV { UINT MipSlice; @@ -4125,133 +3237,6 @@ typedef struct D3D11_DEPTH_STENCIL_VIEW_DESC } ; } D3D11_DEPTH_STENCIL_VIEW_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_DEPTH_STENCIL_VIEW_DESC : public D3D11_DEPTH_STENCIL_VIEW_DESC -{ - CD3D11_DEPTH_STENCIL_VIEW_DESC() - {} - explicit CD3D11_DEPTH_STENCIL_VIEW_DESC( const D3D11_DEPTH_STENCIL_VIEW_DESC& o ) : - D3D11_DEPTH_STENCIL_VIEW_DESC( o ) - {} - explicit CD3D11_DEPTH_STENCIL_VIEW_DESC( - D3D11_DSV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1, - UINT flags = 0 ) - { - Format = format; - ViewDimension = viewDimension; - Flags = flags; - switch (viewDimension) - { - case D3D11_DSV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_DSV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_DSV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_DEPTH_STENCIL_VIEW_DESC( - _In_ ID3D11Texture1D* pTex1D, - D3D11_DSV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1, - UINT flags = 0 ) - { - ViewDimension = viewDimension; - Flags = flags; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_DSV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_DSV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_DSV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_DEPTH_STENCIL_VIEW_DESC( - _In_ ID3D11Texture2D* pTex2D, - D3D11_DSV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1, - UINT flags = 0 ) - { - ViewDimension = viewDimension; - Flags = flags; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && - (D3D11_DSV_DIMENSION_TEXTURE2DARRAY == viewDimension || - D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY == viewDimension))) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_DSV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_DSV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_DSV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_DSV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - default: break; - } - } - ~CD3D11_DEPTH_STENCIL_VIEW_DESC() {} - operator const D3D11_DEPTH_STENCIL_VIEW_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0012_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0012_v0_0_s_ifspec; @@ -4440,157 +3425,6 @@ typedef struct D3D11_UNORDERED_ACCESS_VIEW_DESC } ; } D3D11_UNORDERED_ACCESS_VIEW_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_UNORDERED_ACCESS_VIEW_DESC : public D3D11_UNORDERED_ACCESS_VIEW_DESC -{ - CD3D11_UNORDERED_ACCESS_VIEW_DESC() - {} - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( const D3D11_UNORDERED_ACCESS_VIEW_DESC& o ) : - D3D11_UNORDERED_ACCESS_VIEW_DESC( o ) - {} - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, // FirstElement for BUFFER - UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D - UINT arraySize = -1, // WSize for TEXTURE3D - UINT flags = 0 ) // BUFFER only - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_BUFFER: - Buffer.FirstElement = mipSlice; - Buffer.NumElements = firstArraySlice; - Buffer.Flags = flags; - break; - case D3D11_UAV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_UAV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - case D3D11_UAV_DIMENSION_TEXTURE3D: - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstArraySlice; - Texture3D.WSize = arraySize; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements, - UINT flags = 0 ) - { - Format = format; - ViewDimension = D3D11_UAV_DIMENSION_BUFFER; - Buffer.FirstElement = firstElement; - Buffer.NumElements = numElements; - Buffer.Flags = flags; - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( - _In_ ID3D11Texture1D* pTex1D, - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( - _In_ ID3D11Texture2D* pTex2D, - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE2DARRAY == viewDimension)) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstWSlice = 0, - UINT wSize = -1 ) - { - ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == wSize) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == wSize) wSize = TexDesc.Depth - firstWSlice; - } - Format = format; - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstWSlice; - Texture3D.WSize = wSize; - } - ~CD3D11_UNORDERED_ACCESS_VIEW_DESC() {} - operator const D3D11_UNORDERED_ACCESS_VIEW_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0013_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0013_v0_0_s_ifspec; @@ -5557,65 +4391,6 @@ typedef struct D3D11_SAMPLER_DESC FLOAT MaxLOD; } D3D11_SAMPLER_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_SAMPLER_DESC : public D3D11_SAMPLER_DESC -{ - CD3D11_SAMPLER_DESC() - {} - explicit CD3D11_SAMPLER_DESC( const D3D11_SAMPLER_DESC& o ) : - D3D11_SAMPLER_DESC( o ) - {} - explicit CD3D11_SAMPLER_DESC( CD3D11_DEFAULT ) - { - Filter = D3D11_FILTER_MIN_MAG_MIP_LINEAR; - AddressU = D3D11_TEXTURE_ADDRESS_CLAMP; - AddressV = D3D11_TEXTURE_ADDRESS_CLAMP; - AddressW = D3D11_TEXTURE_ADDRESS_CLAMP; - MipLODBias = 0; - MaxAnisotropy = 1; - ComparisonFunc = D3D11_COMPARISON_NEVER; - BorderColor[ 0 ] = 1.0f; - BorderColor[ 1 ] = 1.0f; - BorderColor[ 2 ] = 1.0f; - BorderColor[ 3 ] = 1.0f; - MinLOD = -3.402823466e+38F; // -FLT_MAX - MaxLOD = 3.402823466e+38F; // FLT_MAX - } - explicit CD3D11_SAMPLER_DESC( - D3D11_FILTER filter, - D3D11_TEXTURE_ADDRESS_MODE addressU, - D3D11_TEXTURE_ADDRESS_MODE addressV, - D3D11_TEXTURE_ADDRESS_MODE addressW, - FLOAT mipLODBias, - UINT maxAnisotropy, - D3D11_COMPARISON_FUNC comparisonFunc, - _In_reads_opt_( 4 ) const FLOAT* borderColor, // RGBA - FLOAT minLOD, - FLOAT maxLOD ) - { - Filter = filter; - AddressU = addressU; - AddressV = addressV; - AddressW = addressW; - MipLODBias = mipLODBias; - MaxAnisotropy = maxAnisotropy; - ComparisonFunc = comparisonFunc; - const float defaultColor[ 4 ] = { 1.0f, 1.0f, 1.0f, 1.0f }; - if (!borderColor) borderColor = defaultColor; - BorderColor[ 0 ] = borderColor[ 0 ]; - BorderColor[ 1 ] = borderColor[ 1 ]; - BorderColor[ 2 ] = borderColor[ 2 ]; - BorderColor[ 3 ] = borderColor[ 3 ]; - MinLOD = minLOD; - MaxLOD = maxLOD; - } - ~CD3D11_SAMPLER_DESC() {} - operator const D3D11_SAMPLER_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0021_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0021_v0_0_s_ifspec; @@ -5942,28 +4717,6 @@ typedef struct D3D11_QUERY_DESC UINT MiscFlags; } D3D11_QUERY_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_QUERY_DESC : public D3D11_QUERY_DESC -{ - CD3D11_QUERY_DESC() - {} - explicit CD3D11_QUERY_DESC( const D3D11_QUERY_DESC& o ) : - D3D11_QUERY_DESC( o ) - {} - explicit CD3D11_QUERY_DESC( - D3D11_QUERY query, - UINT miscFlags = 0 ) - { - Query = query; - MiscFlags = miscFlags; - } - ~CD3D11_QUERY_DESC() {} - operator const D3D11_QUERY_DESC&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0023_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_0000_0023_v0_0_s_ifspec; @@ -6252,27 +5005,6 @@ typedef struct D3D11_COUNTER_DESC UINT MiscFlags; } D3D11_COUNTER_DESC; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_COUNTER_DESC : public D3D11_COUNTER_DESC -{ - CD3D11_COUNTER_DESC() - {} - explicit CD3D11_COUNTER_DESC( const D3D11_COUNTER_DESC& o ) : - D3D11_COUNTER_DESC( o ) - {} - explicit CD3D11_COUNTER_DESC( - D3D11_COUNTER counter, - UINT miscFlags = 0 ) - { - Counter = counter; - MiscFlags = miscFlags; - } - ~CD3D11_COUNTER_DESC() {} - operator const D3D11_COUNTER_DESC&() const { return *this; } -}; -extern "C"{ -#endif typedef struct D3D11_COUNTER_INFO { D3D11_COUNTER LastDeviceDependentCounter; diff --git a/gfx/include/dxsdk/d3d11_1.h b/gfx/include/dxsdk/d3d11_1.h index 9303544f520..c41ec8b829c 100644 --- a/gfx/include/dxsdk/d3d11_1.h +++ b/gfx/include/dxsdk/d3d11_1.h @@ -163,38 +163,6 @@ typedef struct D3D11_BLEND_DESC1 D3D11_RENDER_TARGET_BLEND_DESC1 RenderTarget[ 8 ]; } D3D11_BLEND_DESC1; -/* Note, the array size for RenderTarget[] above is D3D11_SIMULTANEOUS_RENDERTARGET_COUNT. - IDL processing/generation of this header replaces the define; this comment is merely explaining what happened. */ -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_BLEND_DESC1 : public D3D11_BLEND_DESC1 -{ - CD3D11_BLEND_DESC1() - {} - explicit CD3D11_BLEND_DESC1( const D3D11_BLEND_DESC1& o ) : - D3D11_BLEND_DESC1( o ) - {} - explicit CD3D11_BLEND_DESC1( CD3D11_DEFAULT ) - { - AlphaToCoverageEnable = FALSE; - IndependentBlendEnable = FALSE; - const D3D11_RENDER_TARGET_BLEND_DESC1 defaultRenderTargetBlendDesc = - { - FALSE,FALSE, - D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, - D3D11_BLEND_ONE, D3D11_BLEND_ZERO, D3D11_BLEND_OP_ADD, - D3D11_LOGIC_OP_NOOP, - D3D11_COLOR_WRITE_ENABLE_ALL, - }; - for (UINT i = 0; i < D3D11_SIMULTANEOUS_RENDER_TARGET_COUNT; ++i) - RenderTarget[ i ] = defaultRenderTargetBlendDesc; - } - ~CD3D11_BLEND_DESC1() {} - operator const D3D11_BLEND_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_1_0000_0000_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_1_0000_0000_v0_0_s_ifspec; @@ -337,60 +305,6 @@ typedef struct D3D11_RASTERIZER_DESC1 UINT ForcedSampleCount; } D3D11_RASTERIZER_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RASTERIZER_DESC1 : public D3D11_RASTERIZER_DESC1 -{ - CD3D11_RASTERIZER_DESC1() - {} - explicit CD3D11_RASTERIZER_DESC1( const D3D11_RASTERIZER_DESC1& o ) : - D3D11_RASTERIZER_DESC1( o ) - {} - explicit CD3D11_RASTERIZER_DESC1( CD3D11_DEFAULT ) - { - FillMode = D3D11_FILL_SOLID; - CullMode = D3D11_CULL_BACK; - FrontCounterClockwise = FALSE; - DepthBias = D3D11_DEFAULT_DEPTH_BIAS; - DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP; - SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; - DepthClipEnable = TRUE; - ScissorEnable = FALSE; - MultisampleEnable = FALSE; - AntialiasedLineEnable = FALSE; - ForcedSampleCount = 0; - } - explicit CD3D11_RASTERIZER_DESC1( - D3D11_FILL_MODE fillMode, - D3D11_CULL_MODE cullMode, - BOOL frontCounterClockwise, - INT depthBias, - FLOAT depthBiasClamp, - FLOAT slopeScaledDepthBias, - BOOL depthClipEnable, - BOOL scissorEnable, - BOOL multisampleEnable, - BOOL antialiasedLineEnable, - UINT forcedSampleCount ) - { - FillMode = fillMode; - CullMode = cullMode; - FrontCounterClockwise = frontCounterClockwise; - DepthBias = depthBias; - DepthBiasClamp = depthBiasClamp; - SlopeScaledDepthBias = slopeScaledDepthBias; - DepthClipEnable = depthClipEnable; - ScissorEnable = scissorEnable; - MultisampleEnable = multisampleEnable; - AntialiasedLineEnable = antialiasedLineEnable; - ForcedSampleCount = forcedSampleCount; - } - ~CD3D11_RASTERIZER_DESC1() {} - operator const D3D11_RASTERIZER_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_1_0000_0001_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_1_0000_0001_v0_0_s_ifspec; diff --git a/gfx/include/dxsdk/d3d11_3.h b/gfx/include/dxsdk/d3d11_3.h index 6fc17cc828f..0dd710175e8 100644 --- a/gfx/include/dxsdk/d3d11_3.h +++ b/gfx/include/dxsdk/d3d11_3.h @@ -160,65 +160,6 @@ typedef struct D3D11_TEXTURE2D_DESC1 D3D11_TEXTURE_LAYOUT TextureLayout; } D3D11_TEXTURE2D_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_TEXTURE2D_DESC1 : public D3D11_TEXTURE2D_DESC1 -{ - CD3D11_TEXTURE2D_DESC1() - {} - explicit CD3D11_TEXTURE2D_DESC1( const D3D11_TEXTURE2D_DESC1& o ) : - D3D11_TEXTURE2D_DESC1( o ) - {} - explicit CD3D11_TEXTURE2D_DESC1( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT arraySize = 1, - UINT mipLevels = 0, - UINT bindFlags = D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags = 0, - UINT sampleCount = 1, - UINT sampleQuality = 0, - UINT miscFlags = 0, - D3D11_TEXTURE_LAYOUT textureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED) - { - Width = width; - Height = height; - MipLevels = mipLevels; - ArraySize = arraySize; - Format = format; - SampleDesc.Count = sampleCount; - SampleDesc.Quality = sampleQuality; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags; - MiscFlags = miscFlags; - TextureLayout = textureLayout; - } - explicit CD3D11_TEXTURE2D_DESC1( - const D3D11_TEXTURE2D_DESC &desc, - D3D11_TEXTURE_LAYOUT textureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED) - { - Width = desc.Width; - Height = desc.Height; - MipLevels = desc.MipLevels; - ArraySize = desc.ArraySize; - Format = desc.Format; - SampleDesc.Count = desc.SampleDesc.Count; - SampleDesc.Quality = desc. SampleDesc.Quality; - Usage = desc.Usage; - BindFlags = desc.BindFlags; - CPUAccessFlags = desc.CPUAccessFlags; - MiscFlags = desc.MiscFlags; - TextureLayout = textureLayout; - } - ~CD3D11_TEXTURE2D_DESC1() {} - operator const D3D11_TEXTURE2D_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0000_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0000_v0_0_s_ifspec; @@ -382,59 +323,6 @@ typedef struct D3D11_TEXTURE3D_DESC1 D3D11_TEXTURE_LAYOUT TextureLayout; } D3D11_TEXTURE3D_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_TEXTURE3D_DESC1 : public D3D11_TEXTURE3D_DESC1 -{ - CD3D11_TEXTURE3D_DESC1() - {} - explicit CD3D11_TEXTURE3D_DESC1( const D3D11_TEXTURE3D_DESC1& o ) : - D3D11_TEXTURE3D_DESC1( o ) - {} - explicit CD3D11_TEXTURE3D_DESC1( - DXGI_FORMAT format, - UINT width, - UINT height, - UINT depth, - UINT mipLevels = 0, - UINT bindFlags = D3D11_BIND_SHADER_RESOURCE, - D3D11_USAGE usage = D3D11_USAGE_DEFAULT, - UINT cpuaccessFlags = 0, - UINT miscFlags = 0, - D3D11_TEXTURE_LAYOUT textureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED) - { - Width = width; - Height = height; - Depth = depth; - MipLevels = mipLevels; - Format = format; - Usage = usage; - BindFlags = bindFlags; - CPUAccessFlags = cpuaccessFlags; - MiscFlags = miscFlags; - TextureLayout = textureLayout; - } - explicit CD3D11_TEXTURE3D_DESC1( - const D3D11_TEXTURE3D_DESC &desc, - D3D11_TEXTURE_LAYOUT textureLayout = D3D11_TEXTURE_LAYOUT_UNDEFINED) - { - Width = desc.Width; - Height = desc.Height; - Depth = desc.Depth; - MipLevels = desc.MipLevels; - Format = desc.Format; - Usage = desc.Usage; - BindFlags = desc.BindFlags; - CPUAccessFlags = desc.CPUAccessFlags; - MiscFlags = desc.MiscFlags; - TextureLayout = textureLayout; - } - ~CD3D11_TEXTURE3D_DESC1() {} - operator const D3D11_TEXTURE3D_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0001_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0001_v0_0_s_ifspec; @@ -607,63 +495,6 @@ typedef struct D3D11_RASTERIZER_DESC2 D3D11_CONSERVATIVE_RASTERIZATION_MODE ConservativeRaster; } D3D11_RASTERIZER_DESC2; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RASTERIZER_DESC2 : public D3D11_RASTERIZER_DESC2 -{ - CD3D11_RASTERIZER_DESC2() - {} - explicit CD3D11_RASTERIZER_DESC2( const D3D11_RASTERIZER_DESC2& o ) : - D3D11_RASTERIZER_DESC2( o ) - {} - explicit CD3D11_RASTERIZER_DESC2( CD3D11_DEFAULT ) - { - FillMode = D3D11_FILL_SOLID; - CullMode = D3D11_CULL_BACK; - FrontCounterClockwise = FALSE; - DepthBias = D3D11_DEFAULT_DEPTH_BIAS; - DepthBiasClamp = D3D11_DEFAULT_DEPTH_BIAS_CLAMP; - SlopeScaledDepthBias = D3D11_DEFAULT_SLOPE_SCALED_DEPTH_BIAS; - DepthClipEnable = TRUE; - ScissorEnable = FALSE; - MultisampleEnable = FALSE; - AntialiasedLineEnable = FALSE; - ForcedSampleCount = 0; - ConservativeRaster = D3D11_CONSERVATIVE_RASTERIZATION_MODE_OFF; - } - explicit CD3D11_RASTERIZER_DESC2( - D3D11_FILL_MODE fillMode, - D3D11_CULL_MODE cullMode, - BOOL frontCounterClockwise, - INT depthBias, - FLOAT depthBiasClamp, - FLOAT slopeScaledDepthBias, - BOOL depthClipEnable, - BOOL scissorEnable, - BOOL multisampleEnable, - BOOL antialiasedLineEnable, - UINT forcedSampleCount, - D3D11_CONSERVATIVE_RASTERIZATION_MODE conservativeRaster ) - { - FillMode = fillMode; - CullMode = cullMode; - FrontCounterClockwise = frontCounterClockwise; - DepthBias = depthBias; - DepthBiasClamp = depthBiasClamp; - SlopeScaledDepthBias = slopeScaledDepthBias; - DepthClipEnable = depthClipEnable; - ScissorEnable = scissorEnable; - MultisampleEnable = multisampleEnable; - AntialiasedLineEnable = antialiasedLineEnable; - ForcedSampleCount = forcedSampleCount; - ConservativeRaster = conservativeRaster; - } - ~CD3D11_RASTERIZER_DESC2() {} - operator const D3D11_RASTERIZER_DESC2&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0002_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0002_v0_0_s_ifspec; @@ -835,219 +666,6 @@ typedef struct D3D11_SHADER_RESOURCE_VIEW_DESC1 } ; } D3D11_SHADER_RESOURCE_VIEW_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_SHADER_RESOURCE_VIEW_DESC1 : public D3D11_SHADER_RESOURCE_VIEW_DESC1 -{ - CD3D11_SHADER_RESOURCE_VIEW_DESC1() - {} - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( const D3D11_SHADER_RESOURCE_VIEW_DESC1& o ) : - D3D11_SHADER_RESOURCE_VIEW_DESC1( o ) - {} - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, // FirstElement for BUFFER - UINT mipLevels = -1, // NumElements for BUFFER - UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY - UINT arraySize = -1, // NumCubes for TEXTURECUBEARRAY - UINT flags = 0, // BUFFEREX only - UINT planeSlice = 0 ) // Texture2D and Texture2DArray only - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_BUFFER: - Buffer.FirstElement = mostDetailedMip; - Buffer.NumElements = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1D: - Texture1D.MostDetailedMip = mostDetailedMip; - Texture1D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MostDetailedMip = mostDetailedMip; - Texture1DArray.MipLevels = mipLevels; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE2D: - Texture2D.MostDetailedMip = mostDetailedMip; - Texture2D.MipLevels = mipLevels; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MostDetailedMip = mostDetailedMip; - Texture2DArray.MipLevels = mipLevels; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURE3D: - Texture3D.MostDetailedMip = mostDetailedMip; - Texture3D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBE: - TextureCube.MostDetailedMip = mostDetailedMip; - TextureCube.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: - TextureCubeArray.MostDetailedMip = mostDetailedMip; - TextureCubeArray.MipLevels = mipLevels; - TextureCubeArray.First2DArrayFace = firstArraySlice; - TextureCubeArray.NumCubes = arraySize; - break; - case D3D11_SRV_DIMENSION_BUFFEREX: - BufferEx.FirstElement = mostDetailedMip; - BufferEx.NumElements = mipLevels; - BufferEx.Flags = flags; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements, - UINT flags = 0 ) - { - Format = format; - ViewDimension = D3D11_SRV_DIMENSION_BUFFEREX; - BufferEx.FirstElement = firstElement; - BufferEx.NumElements = numElements; - BufferEx.Flags = flags; - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( - _In_ ID3D11Texture1D* pTex1D, - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || -1 == mipLevels || - (-1 == arraySize && D3D11_SRV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_TEXTURE1D: - Texture1D.MostDetailedMip = mostDetailedMip; - Texture1D.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MostDetailedMip = mostDetailedMip; - Texture1DArray.MipLevels = mipLevels; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( - _In_ ID3D11Texture2D* pTex2D, - D3D11_SRV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1, - UINT firstArraySlice = 0, // First2DArrayFace for TEXTURECUBEARRAY - UINT arraySize = -1, // NumCubes for TEXTURECUBEARRAY - UINT planeSlice = 0 ) // PlaneSlice for TEXTURE2D or TEXTURE2DARRAY - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == mipLevels && - D3D11_SRV_DIMENSION_TEXTURE2DMS != viewDimension && - D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY != viewDimension) || - (-1 == arraySize && - (D3D11_SRV_DIMENSION_TEXTURE2DARRAY == viewDimension || - D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY == viewDimension || - D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension))) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - if (-1 == arraySize) - { - arraySize = TexDesc.ArraySize - firstArraySlice; - if (D3D11_SRV_DIMENSION_TEXTURECUBEARRAY == viewDimension) arraySize /= 6; - } - } - Format = format; - switch (viewDimension) - { - case D3D11_SRV_DIMENSION_TEXTURE2D: - Texture2D.MostDetailedMip = mostDetailedMip; - Texture2D.MipLevels = mipLevels; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MostDetailedMip = mostDetailedMip; - Texture2DArray.MipLevels = mipLevels; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_SRV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBE: - TextureCube.MostDetailedMip = mostDetailedMip; - TextureCube.MipLevels = mipLevels; - break; - case D3D11_SRV_DIMENSION_TEXTURECUBEARRAY: - TextureCubeArray.MostDetailedMip = mostDetailedMip; - TextureCubeArray.MipLevels = mipLevels; - TextureCubeArray.First2DArrayFace = firstArraySlice; - TextureCubeArray.NumCubes = arraySize; - break; - default: break; - } - } - explicit CD3D11_SHADER_RESOURCE_VIEW_DESC1( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mostDetailedMip = 0, - UINT mipLevels = -1 ) - { - ViewDimension = D3D11_SRV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == mipLevels) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == mipLevels) mipLevels = TexDesc.MipLevels - mostDetailedMip; - } - Format = format; - Texture3D.MostDetailedMip = mostDetailedMip; - Texture3D.MipLevels = mipLevels; - } - ~CD3D11_SHADER_RESOURCE_VIEW_DESC1() {} - operator const D3D11_SHADER_RESOURCE_VIEW_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0003_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0003_v0_0_s_ifspec; @@ -1214,173 +832,6 @@ typedef struct D3D11_RENDER_TARGET_VIEW_DESC1 } ; } D3D11_RENDER_TARGET_VIEW_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_RENDER_TARGET_VIEW_DESC1 : public D3D11_RENDER_TARGET_VIEW_DESC1 -{ - CD3D11_RENDER_TARGET_VIEW_DESC1() - {} - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( const D3D11_RENDER_TARGET_VIEW_DESC1& o ) : - D3D11_RENDER_TARGET_VIEW_DESC1( o ) - {} - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, // FirstElement for BUFFER - UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D - UINT arraySize = -1, // WSize for TEXTURE3D - UINT planeSlice = 0 ) // PlaneSlice for TEXTURE2D and TEXTURE2DARRAY - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_BUFFER: - Buffer.FirstElement = mipSlice; - Buffer.NumElements = firstArraySlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - case D3D11_RTV_DIMENSION_TEXTURE3D: - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstArraySlice; - Texture3D.WSize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements ) - { - Format = format; - ViewDimension = D3D11_RTV_DIMENSION_BUFFER; - Buffer.FirstElement = firstElement; - Buffer.NumElements = numElements; - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( - _In_ ID3D11Texture1D* pTex1D, - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_RTV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( - _In_ ID3D11Texture2D* pTex2D, - D3D11_RTV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1, - UINT planeSlice = 0 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && - (D3D11_RTV_DIMENSION_TEXTURE2DARRAY == viewDimension || - D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY == viewDimension))) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_RTV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMS: - break; - case D3D11_RTV_DIMENSION_TEXTURE2DMSARRAY: - Texture2DMSArray.FirstArraySlice = firstArraySlice; - Texture2DMSArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_RENDER_TARGET_VIEW_DESC1( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstWSlice = 0, - UINT wSize = -1 ) - { - ViewDimension = D3D11_RTV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == wSize) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == wSize) wSize = TexDesc.Depth - firstWSlice; - } - Format = format; - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstWSlice; - Texture3D.WSize = wSize; - } - ~CD3D11_RENDER_TARGET_VIEW_DESC1() {} - operator const D3D11_RENDER_TARGET_VIEW_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0004_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0004_v0_0_s_ifspec; @@ -1545,163 +996,6 @@ typedef struct D3D11_UNORDERED_ACCESS_VIEW_DESC1 } ; } D3D11_UNORDERED_ACCESS_VIEW_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_UNORDERED_ACCESS_VIEW_DESC1 : public D3D11_UNORDERED_ACCESS_VIEW_DESC1 -{ - CD3D11_UNORDERED_ACCESS_VIEW_DESC1() - {} - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( const D3D11_UNORDERED_ACCESS_VIEW_DESC1& o ) : - D3D11_UNORDERED_ACCESS_VIEW_DESC1( o ) - {} - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, // FirstElement for BUFFER - UINT firstArraySlice = 0, // NumElements for BUFFER, FirstWSlice for TEXTURE3D - UINT arraySize = -1, // WSize for TEXTURE3D - UINT flags = 0, // BUFFER only - UINT planeSlice = 0 ) // PlaneSlice for TEXTURE2D and TEXTURE2DARRAY - { - Format = format; - ViewDimension = viewDimension; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_BUFFER: - Buffer.FirstElement = mipSlice; - Buffer.NumElements = firstArraySlice; - Buffer.Flags = flags; - break; - case D3D11_UAV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - case D3D11_UAV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE3D: - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstArraySlice; - Texture3D.WSize = arraySize; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( - _In_ ID3D11Buffer*, - DXGI_FORMAT format, - UINT firstElement, - UINT numElements, - UINT flags = 0 ) - { - Format = format; - ViewDimension = D3D11_UAV_DIMENSION_BUFFER; - Buffer.FirstElement = firstElement; - Buffer.NumElements = numElements; - Buffer.Flags = flags; - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( - _In_ ID3D11Texture1D* pTex1D, - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE1DARRAY == viewDimension)) - { - D3D11_TEXTURE1D_DESC TexDesc; - pTex1D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_TEXTURE1D: - Texture1D.MipSlice = mipSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE1DARRAY: - Texture1DArray.MipSlice = mipSlice; - Texture1DArray.FirstArraySlice = firstArraySlice; - Texture1DArray.ArraySize = arraySize; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( - _In_ ID3D11Texture2D* pTex2D, - D3D11_UAV_DIMENSION viewDimension, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstArraySlice = 0, - UINT arraySize = -1, - UINT planeSlice = 0 ) - { - ViewDimension = viewDimension; - if (DXGI_FORMAT_UNKNOWN == format || - (-1 == arraySize && D3D11_UAV_DIMENSION_TEXTURE2DARRAY == viewDimension)) - { - D3D11_TEXTURE2D_DESC TexDesc; - pTex2D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == arraySize) arraySize = TexDesc.ArraySize - firstArraySlice; - } - Format = format; - switch (viewDimension) - { - case D3D11_UAV_DIMENSION_TEXTURE2D: - Texture2D.MipSlice = mipSlice; - Texture2D.PlaneSlice = planeSlice; - break; - case D3D11_UAV_DIMENSION_TEXTURE2DARRAY: - Texture2DArray.MipSlice = mipSlice; - Texture2DArray.FirstArraySlice = firstArraySlice; - Texture2DArray.ArraySize = arraySize; - Texture2DArray.PlaneSlice = planeSlice; - break; - default: break; - } - } - explicit CD3D11_UNORDERED_ACCESS_VIEW_DESC1( - _In_ ID3D11Texture3D* pTex3D, - DXGI_FORMAT format = DXGI_FORMAT_UNKNOWN, - UINT mipSlice = 0, - UINT firstWSlice = 0, - UINT wSize = -1 ) - { - ViewDimension = D3D11_UAV_DIMENSION_TEXTURE3D; - if (DXGI_FORMAT_UNKNOWN == format || -1 == wSize) - { - D3D11_TEXTURE3D_DESC TexDesc; - pTex3D->GetDesc( &TexDesc ); - if (DXGI_FORMAT_UNKNOWN == format) format = TexDesc.Format; - if (-1 == wSize) wSize = TexDesc.Depth - firstWSlice; - } - Format = format; - Texture3D.MipSlice = mipSlice; - Texture3D.FirstWSlice = firstWSlice; - Texture3D.WSize = wSize; - } - ~CD3D11_UNORDERED_ACCESS_VIEW_DESC1() {} - operator const D3D11_UNORDERED_ACCESS_VIEW_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0005_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0005_v0_0_s_ifspec; @@ -1844,30 +1138,6 @@ typedef struct D3D11_QUERY_DESC1 D3D11_CONTEXT_TYPE ContextType; } D3D11_QUERY_DESC1; -#if !defined( D3D11_NO_HELPERS ) && defined( __cplusplus ) -} -struct CD3D11_QUERY_DESC1 : public D3D11_QUERY_DESC1 -{ - CD3D11_QUERY_DESC1() - {} - explicit CD3D11_QUERY_DESC1( const D3D11_QUERY_DESC1& o ) : - D3D11_QUERY_DESC1( o ) - {} - explicit CD3D11_QUERY_DESC1( - D3D11_QUERY query, - UINT miscFlags = 0, - D3D11_CONTEXT_TYPE contextType = D3D11_CONTEXT_TYPE_ALL ) - { - Query = query; - MiscFlags = miscFlags; - ContextType = contextType; - } - ~CD3D11_QUERY_DESC1() {} - operator const D3D11_QUERY_DESC1&() const { return *this; } -}; -extern "C"{ -#endif - extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0006_v0_0_c_ifspec; extern RPC_IF_HANDLE __MIDL_itf_d3d11_3_0000_0006_v0_0_s_ifspec; diff --git a/gfx/video_driver.c b/gfx/video_driver.c index 6bec3759343..8f9a3ea22d8 100644 --- a/gfx/video_driver.c +++ b/gfx/video_driver.c @@ -2061,9 +2061,12 @@ void video_viewport_get_scaled_aspect2(struct video_viewport *vp, unsigned viewp { video_viewport_t *custom_vp = &settings->video_viewport_custom; x = custom_vp->x; - y = custom_vp->y - custom_vp->height; + y = custom_vp->y; if (!ydown) + { + y = y + custom_vp->height; y = vp->full_height - y; + } viewport_width = custom_vp->width; viewport_height = custom_vp->height; } @@ -2329,8 +2332,8 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp, float aspect_ratio, bool keep_aspect, bool ydown) { - int padding_x = 0; - int padding_y = 0; + int x = 0; + int y = 0; settings_t *settings = config_get_ptr(); video_driver_state_t *video_st = &video_driver_st; unsigned video_aspect_ratio_idx = settings->uints.video_aspect_ratio_idx; @@ -2338,17 +2341,23 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp, if (video_aspect_ratio_idx == ASPECT_RATIO_CUSTOM) { struct video_viewport *custom_vp = &settings->video_viewport_custom; - if (custom_vp) { - padding_x = width - custom_vp->width; - padding_y = height - custom_vp->height; + x = custom_vp->x; + y = custom_vp->y; + if (!ydown) + { + y += custom_vp->height; + y = vp->height - y; + } width = custom_vp->width; height = custom_vp->height; } } else { + int padding_x = 0; + int padding_y = 0; float viewport_bias_x = settings->floats.video_viewport_bias_x; float viewport_bias_y = settings->floats.video_viewport_bias_y; unsigned base_width; @@ -2369,10 +2378,10 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp, viewport_bias_y = 1.0 - viewport_bias_y; if (rotation % 2) - base_height = video_st->av_info.geometry.base_width; + base_height = video_st->av_info.geometry.base_width; if (base_height == 0) - base_height = 1; + base_height = 1; /* Account for non-square pixels. * This is sort of contradictory with the goal of integer scale, @@ -2410,14 +2419,14 @@ void video_viewport_get_scaled_integer(struct video_viewport *vp, width -= padding_x; height -= padding_y; - padding_x *= viewport_bias_x; - padding_y *= viewport_bias_y; + x = padding_x * viewport_bias_x; + y = padding_y * viewport_bias_y; } vp->width = width; vp->height = height; - vp->x = padding_x; - vp->y = padding_y; + vp->x = x; + vp->y = y; } void video_driver_display_type_set(enum rarch_display_type type) diff --git a/griffin/griffin.c b/griffin/griffin.c index 7d10d179cfc..f3f169a2855 100644 --- a/griffin/griffin.c +++ b/griffin/griffin.c @@ -737,6 +737,7 @@ INPUT #ifdef HAVE_TEST_DRIVERS #include "../input/drivers_joypad/test_joypad.c" +#include "../input/drivers/test_input.c" #endif /*============================================================ diff --git a/griffin/griffin_objc.m b/griffin/griffin_objc.m index b42b8fe75af..c37b9b56309 100644 --- a/griffin/griffin_objc.m +++ b/griffin/griffin_objc.m @@ -71,3 +71,7 @@ #if defined(HAVE_NETWORKING) && defined(HAVE_NETPLAYDISCOVERY) && defined(HAVE_NETPLAYDISCOVERY_NSNET) #import "../network/netplay/netplay_nsnetservice.m" #endif + +#if defined(HAVE_CLOUDSYNC) && defined(HAVE_ICLOUD) +#include "../network/cloud_sync/icloud.m" +#endif diff --git a/input/drivers/test_input.c b/input/drivers/test_input.c new file mode 100644 index 00000000000..432e4b7ab05 --- /dev/null +++ b/input/drivers/test_input.c @@ -0,0 +1,557 @@ +/* RetroArch - A frontend for libretro. + * Copyright (C) 2010-2014 - Hans-Kristian Arntzen + * Copyright (C) 2011-2017 - Daniel De Matteis + * Copyright (C) 2016-2019 - Brad Parker + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#include +#include +#include + +#include +#include +#include +#include +#include + +#include "../input_driver.h" +#include "../input_keymaps.h" +#include "../../verbosity.h" +#include "../../gfx/video_driver.h" + +#define MAX_TEST_STEPS 200 + +#define INPUT_TEST_COMMAND_PRESS_KEY 1 +#define INPUT_TEST_COMMAND_RELEASE_KEY 2 +#define INPUT_TEST_COMMAND_SET_SENSOR_ACC_X 10 +#define INPUT_TEST_COMMAND_SET_SENSOR_ACC_Y 11 +#define INPUT_TEST_COMMAND_SET_SENSOR_ACC_Z 12 +#define INPUT_TEST_COMMAND_SET_SENSOR_GYR_X 13 +#define INPUT_TEST_COMMAND_SET_SENSOR_GYR_Y 14 +#define INPUT_TEST_COMMAND_SET_SENSOR_GYR_Z 15 +#define INPUT_TEST_COMMAND_SET_SENSOR_LUX 16 + +/* TODO/FIXME - static globals */ +static uint16_t test_key_state[DEFAULT_MAX_PADS+1][RETROK_LAST]; + +typedef struct +{ + float x; + float y; + float z; +} sensor_t; + +typedef struct test_input +{ + sensor_t accelerometer_state; /* float alignment */ + sensor_t gyroscope_state; /* float alignment */ + float lux_sensor_state; +} test_input_t; + +static test_input_t test_input_values; + +typedef struct +{ + unsigned frame; + unsigned action; + unsigned param_num; + char param_str[255]; + bool handled; +} input_test_step_t; + +static input_test_step_t input_test_steps[MAX_TEST_STEPS]; + +static unsigned current_frame = 0; +static unsigned next_teststep_frame = 0; +static unsigned current_test_step = 0; +static unsigned last_test_step = MAX_TEST_STEPS + 1; +static uint32_t input_state_validated = 0; +static uint32_t combo_state_validated = 0; +static bool dump_state_blocked = false; + +/************************************/ +/* JSON Helpers for test input file */ +/************************************/ + +typedef struct +{ + unsigned *current_entry_uint_val; + char **current_entry_str_val; + unsigned frame; + unsigned action; + unsigned param_num; + char *param_str; +} KTifJSONContext; + +static bool KTifJSONObjectEndHandler(void* context) +{ + KTifJSONContext *pCtx = (KTifJSONContext*)context; + + /* Too long input is handled elsewhere, it should not lead to parse error */ + if (current_test_step >= MAX_TEST_STEPS) + return true; + + /* Copy values read from JSON file + fill defaults */ + if (pCtx->frame == 0xffff) + input_test_steps[current_test_step].frame = input_test_steps[current_test_step-1].frame + 60; + else + input_test_steps[current_test_step].frame = pCtx->frame; + + input_test_steps[current_test_step].action = pCtx->action; + input_test_steps[current_test_step].param_num = pCtx->param_num; + input_test_steps[current_test_step].handled = false; + + if (!string_is_empty(pCtx->param_str)) + strlcpy( + input_test_steps[current_test_step].param_str, pCtx->param_str, + sizeof(input_test_steps[current_test_step].param_str)); + else + input_test_steps[current_test_step].param_str[0] = '\0'; + + current_test_step++; + last_test_step = current_test_step; + pCtx->frame = 0xffff; + return true; +} + +static bool KTifJSONObjectMemberHandler(void* context, const char *pValue, size_t length) +{ + KTifJSONContext *pCtx = (KTifJSONContext*)context; + + /* something went wrong */ + if (pCtx->current_entry_str_val) + return false; + + if (length) + { + if (string_is_equal(pValue, "frame")) + pCtx->current_entry_uint_val = &pCtx->frame; + else if (string_is_equal(pValue, "action")) + pCtx->current_entry_uint_val = &pCtx->action; + else if (string_is_equal(pValue, "param_num")) + pCtx->current_entry_uint_val = &pCtx->param_num; + else if (string_is_equal(pValue, "param_str")) + pCtx->current_entry_str_val = &pCtx->param_str; + /* ignore unknown members */ + } + + return true; +} + +static bool KTifJSONNumberHandler(void* context, const char *pValue, size_t length) +{ + KTifJSONContext *pCtx = (KTifJSONContext*)context; + + if (pCtx->current_entry_uint_val && length && !string_is_empty(pValue)) + *pCtx->current_entry_uint_val = string_to_unsigned(pValue); + /* ignore unknown members */ + + pCtx->current_entry_uint_val = NULL; + + return true; +} + +static bool KTifJSONStringHandler(void* context, const char *pValue, size_t length) +{ + KTifJSONContext *pCtx = (KTifJSONContext*)context; + + if (pCtx->current_entry_str_val && length && !string_is_empty(pValue)) + { + if (*pCtx->current_entry_str_val) + free(*pCtx->current_entry_str_val); + + *pCtx->current_entry_str_val = strdup(pValue); + } + /* ignore unknown members */ + + pCtx->current_entry_str_val = NULL; + + return true; +} + +/* Parses test input file referenced by file_path. + * Does nothing if test input file does not exist. */ +static bool input_test_file_read(const char* file_path) +{ + bool success = false; + KTifJSONContext context = {0}; + RFILE *file = NULL; + rjson_t* parser; + + /* Sanity check */ + if ( string_is_empty(file_path) + || !path_is_valid(file_path) + ) + { + RARCH_DBG("[Test input driver]: No test input file supplied.\n"); + return false; + } + + /* Attempt to open test input file */ + file = filestream_open( + file_path, + RETRO_VFS_FILE_ACCESS_READ, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + + if (!file) + { + RARCH_ERR("[Test input driver]: Failed to open test input file: \"%s\".\n", + file_path); + return false; + } + + /* Initialise JSON parser */ + if (!(parser = rjson_open_rfile(file))) + { + RARCH_ERR("[Test input driver]: Failed to create JSON parser.\n"); + goto end; + } + + /* Configure parser */ + rjson_set_options(parser, RJSON_OPTION_ALLOW_UTF8BOM); + + /* Read file */ + if (rjson_parse(parser, &context, + KTifJSONObjectMemberHandler, + KTifJSONStringHandler, + KTifJSONNumberHandler, + NULL, KTifJSONObjectEndHandler, NULL, NULL, /* object/array handlers */ + NULL, NULL) /* unused boolean/null handlers */ + != RJSON_DONE) + { + if (rjson_get_source_context_len(parser)) + { + RARCH_ERR( + "[Test input driver]: Error parsing chunk of test input file: %s\n---snip---\n%.*s\n---snip---\n", + file_path, + rjson_get_source_context_len(parser), + rjson_get_source_context_buf(parser)); + } + RARCH_WARN( + "[Test input driver]: Error parsing test input file: %s\n", + file_path); + RARCH_ERR( + "[Test input driver]: Error: Invalid JSON at line %d, column %d - %s.\n", + (int)rjson_get_source_line(parser), + (int)rjson_get_source_column(parser), + (*rjson_get_error(parser) ? rjson_get_error(parser) : "format error")); + } + + /* Free parser */ + rjson_free(parser); + + success = true; +end: + /* Clean up leftover strings */ + if (context.param_str) + free(context.param_str); + + /* Close log file */ + filestream_close(file); + + if (last_test_step >= MAX_TEST_STEPS) + { + RARCH_WARN("[Test input driver]: too long test input json, maximum size: %d\n",MAX_TEST_STEPS); + } + for (current_test_step = 0; current_test_step < last_test_step; current_test_step++) + { + RARCH_DBG( + "[Test input driver]: test step %02d read from file: frame %d, action %x, num %x, str %s\n", + current_test_step, + input_test_steps[current_test_step].frame, + input_test_steps[current_test_step].action, + input_test_steps[current_test_step].param_num, + input_test_steps[current_test_step].param_str); + } + current_test_step = 0; + return success; +} + +/********************************/ +/* Test input file handling end */ +/********************************/ + + +/*uint16_t *test_keyboard_state_get(unsigned port) +{ + return test_key_state[port]; +}*/ + +static void test_keyboard_free(void) +{ + unsigned i, j; + + for (i = 0; i < DEFAULT_MAX_PADS; i++) + for (j = 0; j < RETROK_LAST; j++) + test_key_state[i][j] = 0; +} + +static int16_t test_input_state( + void *data, + const input_device_driver_t *joypad, + const input_device_driver_t *sec_joypad, + rarch_joypad_info_t *joypad_info, + const retro_keybind_set *binds, + bool keyboard_mapping_blocked, + unsigned port, + unsigned device, + unsigned idx, + unsigned id) +{ + if (port <= 0) + { + switch (device) + { +/* TODO: something clear here */ + case RETRO_DEVICE_JOYPAD: + if (id == RETRO_DEVICE_ID_JOYPAD_MASK) + { + unsigned i; + int16_t ret = 0; + + if (!keyboard_mapping_blocked && id < RARCH_BIND_LIST_END) + { + for (i = 0; i < RARCH_FIRST_CUSTOM_BIND; i++) + { + if (binds[port][i].valid) + { + if ( (binds[port][i].key && binds[port][i].key < RETROK_LAST) + && test_key_state[DEFAULT_MAX_PADS][binds[port][id].key]) + ret |= (1 << i); + } + } + } + return ret; + } + + if (id < RARCH_BIND_LIST_END) + { + if (binds[port][id].valid) + { + if ( (binds[port][id].key && binds[port][id].key < RETROK_LAST) + && test_key_state[DEFAULT_MAX_PADS][binds[port][id].key] + && (id == RARCH_GAME_FOCUS_TOGGLE || !keyboard_mapping_blocked) + ) + return 1; + + } + } + break; + + case RETRO_DEVICE_KEYBOARD: + if (id && id < RETROK_LAST) + return (test_key_state[DEFAULT_MAX_PADS][id]); + break; + } + } + + return 0; +} + +static void test_input_free_input(void *data) +{ + test_keyboard_free(); +} + +static void* test_input_init(const char *joypad_driver) +{ + settings_t *settings = config_get_ptr(); + unsigned i; + + RARCH_DBG("[Test input driver]: start\n"); + + input_test_file_read(settings->paths.test_input_file_general); + if (last_test_step > MAX_TEST_STEPS) + last_test_step = 0; + + /* No need for keyboard mapping look-up table */ + /* input_keymaps_init_keyboard_lut(rarch_key_map_test);*/ + return (void*)-1; +} + +static float test_input_unsigned_to_float_acc(unsigned i) +{ + if (i>200) + return 0.0f; + return ((signed int)(100-i))/100.0f*9.81f; +} + +static float test_input_unsigned_to_float_gyro(unsigned i) +{ + if (i>200) + return 0.0f; + return ((signed int)(100-i))/100.0f; +} + +static float test_input_unsigned_to_float_lux(unsigned i) +{ + if (i>200 || i<100) + return 0.0f; + return (float)pow(10,(((i-100)/100.0f)*4)); +} + + +static void test_input_poll(void *data) +{ + video_driver_state_t *video_st = video_state_get_ptr(); + uint64_t curr_frame = video_st->frame_count; + unsigned i; + + for (i=0; i input_test_steps[i].frame) + { + if( input_test_steps[i].action == INPUT_TEST_COMMAND_PRESS_KEY) + { + if(input_test_steps[i].param_num < RETROK_LAST) + { + test_key_state[DEFAULT_MAX_PADS][input_test_steps[i].param_num] = 1; + input_keyboard_event(true, input_test_steps[i].param_num, 0, 0, RETRO_DEVICE_KEYBOARD); + } + input_test_steps[i].handled = true; + RARCH_DBG( + "[Test input driver]: Pressing keyboard button %d at frame %d\n", + input_test_steps[i].param_num, curr_frame); + } + else if( input_test_steps[i].action == INPUT_TEST_COMMAND_RELEASE_KEY) + { + if(input_test_steps[i].param_num < RETROK_LAST) + { + test_key_state[DEFAULT_MAX_PADS][input_test_steps[i].param_num] = 0; + input_keyboard_event(false, input_test_steps[i].param_num, 0, 0, RETRO_DEVICE_KEYBOARD); + } + input_test_steps[i].handled = true; + RARCH_DBG( + "[Test input driver]: Releasing keyboard button %d at frame %d\n", + input_test_steps[i].param_num, curr_frame); + } + else if(input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_ACC_X || + input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_ACC_Y || + input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_ACC_Z) + { + float setval = test_input_unsigned_to_float_acc(input_test_steps[i].param_num); + switch (input_test_steps[i].action) + { + case INPUT_TEST_COMMAND_SET_SENSOR_ACC_X: + test_input_values.accelerometer_state.x = setval; + break; + case INPUT_TEST_COMMAND_SET_SENSOR_ACC_Y: + test_input_values.accelerometer_state.y = setval; + break; + case INPUT_TEST_COMMAND_SET_SENSOR_ACC_Z: + test_input_values.accelerometer_state.z = setval; + break; + } + input_test_steps[i].handled = true; + RARCH_DBG( + "[Test input driver]: Setting accelerometer axis %d to %f at frame %d\n", + input_test_steps[i].action - INPUT_TEST_COMMAND_SET_SENSOR_ACC_X, setval, curr_frame); + } + else if(input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_GYR_X || + input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_GYR_Y || + input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_GYR_Z) + { + float setval = test_input_unsigned_to_float_gyro(input_test_steps[i].param_num); + switch (input_test_steps[i].action) + { + case INPUT_TEST_COMMAND_SET_SENSOR_GYR_X: + test_input_values.gyroscope_state.x = setval; + break; + case INPUT_TEST_COMMAND_SET_SENSOR_GYR_Y: + test_input_values.gyroscope_state.y = setval; + break; + case INPUT_TEST_COMMAND_SET_SENSOR_GYR_Z: + test_input_values.gyroscope_state.z = setval; + break; + } + input_test_steps[i].handled = true; + RARCH_DBG( + "[Test input driver]: Setting gyroscope axis %d to %f at frame %d\n", + input_test_steps[i].action - INPUT_TEST_COMMAND_SET_SENSOR_GYR_X, setval, curr_frame); + } + else if(input_test_steps[i].action == INPUT_TEST_COMMAND_SET_SENSOR_LUX) + { + float setval = test_input_unsigned_to_float_lux(input_test_steps[i].param_num); + test_input_values.lux_sensor_state = setval; + input_test_steps[i].handled = true; + RARCH_DBG( + "[Test input driver]: Setting lux sensor to %f at frame %d\n", + setval, curr_frame); + } + else + { + input_test_steps[i].handled = true; + RARCH_WARN( + "[Test input driver]: Unrecognized action %d in step %d, skipping\n", + input_test_steps[i].action,i); + } + } + } +} + +static bool test_input_set_sensor_state(void *data, unsigned port, + enum retro_sensor_action action, unsigned event_rate) +{ + RARCH_DBG("[Test input driver]: Setting sensor action %d rate %d\n",action, event_rate); + return true; +} + +static float test_input_get_sensor_input(void *data, + unsigned port, unsigned id) +{ + switch (id) + { + case RETRO_SENSOR_ACCELEROMETER_X: + return test_input_values.accelerometer_state.x; + case RETRO_SENSOR_ACCELEROMETER_Y: + return test_input_values.accelerometer_state.y; + case RETRO_SENSOR_ACCELEROMETER_Z: + return test_input_values.accelerometer_state.z; + case RETRO_SENSOR_GYROSCOPE_X: + return test_input_values.gyroscope_state.x; + case RETRO_SENSOR_GYROSCOPE_Y: + return test_input_values.gyroscope_state.y; + case RETRO_SENSOR_GYROSCOPE_Z: + return test_input_values.gyroscope_state.z; + case RETRO_SENSOR_ILLUMINANCE: + return test_input_values.lux_sensor_state; + } + + return 0.0f; +} + +static uint64_t test_input_get_capabilities(void *data) +{ + return + (1 << RETRO_DEVICE_JOYPAD) + | (1 << RETRO_DEVICE_ANALOG) + | (1 << RETRO_DEVICE_KEYBOARD) +/* | (1 << RETRO_DEVICE_MOUSE) + | (1 << RETRO_DEVICE_POINTER) + | (1 << RETRO_DEVICE_LIGHTGUN)*/; +} + +input_driver_t input_test = { + test_input_init, + test_input_poll, + test_input_state, + test_input_free_input, + test_input_set_sensor_state, + test_input_get_sensor_input, + test_input_get_capabilities, + "test", + NULL, /* grab_mouse */ + NULL, + NULL +}; diff --git a/input/drivers_hid/wiiusb_hid.c b/input/drivers_hid/wiiusb_hid.c index 836f2662880..4756d5e2737 100644 --- a/input/drivers_hid/wiiusb_hid.c +++ b/input/drivers_hid/wiiusb_hid.c @@ -310,7 +310,7 @@ static int wiiusb_hid_add_adapter(void *data, usb_device_entry *dev) /* Allocate mem for the send control buffer, 32bit aligned */ adapter->send_control_type = WIIUSB_SC_NONE; - adapter->send_control_buffer = memalign(32, 128); + adapter->send_control_buffer = (uint8_t*)memalign(32, 128); if (!adapter->send_control_buffer) { @@ -333,7 +333,7 @@ static int wiiusb_hid_add_adapter(void *data, usb_device_entry *dev) goto error; } - adapter->data = memalign(32, 128); + adapter->data = (uint8_t*)memalign(32, 128); adapter->hid = hid; adapter->next = hid->adapters_head; hid->adapters_head = adapter; @@ -551,11 +551,11 @@ static int16_t wiiusb_hid_joypad_state( const uint32_t joyaxis = (binds[i].joyaxis != AXIS_NONE) ? binds[i].joyaxis : joypad_info->auto_binds[i].joyaxis; if ( - (uint16_t)joykey != NO_BTN + (uint16_t)joykey != NO_BTN && wiiusb_hid_joypad_button(data, port_idx, (uint16_t)joykey)) ret |= ( 1 << i); else if (joyaxis != AXIS_NONE && - ((float)abs(wiiusb_hid_joypad_axis(data, port_idx, joyaxis)) + ((float)abs(wiiusb_hid_joypad_axis(data, port_idx, joyaxis)) / 0x8000) > joypad_info->axis_threshold) ret |= (1 << i); } diff --git a/input/drivers_joypad/test_joypad.c b/input/drivers_joypad/test_joypad.c index ac9a87a9f4c..9c7dcf1fcfa 100644 --- a/input/drivers_joypad/test_joypad.c +++ b/input/drivers_joypad/test_joypad.c @@ -194,7 +194,7 @@ static bool input_test_file_read(const char* file_path) || !path_is_valid(file_path) ) { - RARCH_DBG("[Test input driver]: No test input file supplied.\n"); + RARCH_DBG("[Test joypad driver]: No test input file supplied.\n"); return false; } @@ -206,7 +206,7 @@ static bool input_test_file_read(const char* file_path) if (!file) { - RARCH_ERR("[Test input driver]: Failed to open test input file: \"%s\".\n", + RARCH_ERR("[Test joypad driver]: Failed to open test input file: \"%s\".\n", file_path); return false; } @@ -214,7 +214,7 @@ static bool input_test_file_read(const char* file_path) /* Initialise JSON parser */ if (!(parser = rjson_open_rfile(file))) { - RARCH_ERR("[Test input driver]: Failed to create JSON parser.\n"); + RARCH_ERR("[Test joypad driver]: Failed to create JSON parser.\n"); goto end; } @@ -233,16 +233,16 @@ static bool input_test_file_read(const char* file_path) if (rjson_get_source_context_len(parser)) { RARCH_ERR( - "[Test input driver]: Error parsing chunk of test input file: %s\n---snip---\n%.*s\n---snip---\n", + "[Test joypad driver]: Error parsing chunk of test input file: %s\n---snip---\n%.*s\n---snip---\n", file_path, rjson_get_source_context_len(parser), rjson_get_source_context_buf(parser)); } RARCH_WARN( - "[Test input driver]: Error parsing test input file: %s\n", + "[Test joypad driver]: Error parsing test input file: %s\n", file_path); RARCH_ERR( - "[Test input driver]: Error: Invalid JSON at line %d, column %d - %s.\n", + "[Test joypad driver]: Error: Invalid JSON at line %d, column %d - %s.\n", (int)rjson_get_source_line(parser), (int)rjson_get_source_column(parser), (*rjson_get_error(parser) ? rjson_get_error(parser) : "format error")); @@ -262,12 +262,12 @@ static bool input_test_file_read(const char* file_path) if (last_test_step >= MAX_TEST_STEPS) { - RARCH_WARN("[Test input driver]: too long test input json, maximum size: %d\n",MAX_TEST_STEPS); + RARCH_WARN("[Test joypad driver]: too long test input json, maximum size: %d\n",MAX_TEST_STEPS); } for (current_test_step = 0; current_test_step < last_test_step; current_test_step++) { RARCH_DBG( - "[Test input driver]: test step %02d read from file: frame %d, action %x, num %x, str %s\n", + "[Test joypad driver]: test step %02d read from file: frame %d, action %x, num %x, str %s\n", current_test_step, input_test_steps[current_test_step].frame, input_test_steps[current_test_step].action, @@ -433,7 +433,7 @@ static void test_joypad_poll(void) test_joypads[targetpad].button_state |= input_test_steps[i].param_num; input_test_steps[i].handled = true; RARCH_DBG( - "[Test input driver]: Pressing device %d buttons %x, new state %x.\n", + "[Test joypad driver]: Pressing device %d buttons %x, new state %x.\n", targetpad,input_test_steps[i].param_num,test_joypads[targetpad].button_state); } else if( input_test_steps[i].action >= JOYPAD_TEST_COMMAND_BUTTON_RELEASE_FIRST && @@ -443,7 +443,7 @@ static void test_joypad_poll(void) test_joypads[targetpad].button_state &= ~input_test_steps[i].param_num; input_test_steps[i].handled = true; RARCH_DBG( - "[Test input driver]: Releasing device %d buttons %x, new state %x.\n", + "[Test joypad driver]: Releasing device %d buttons %x, new state %x.\n", targetpad,input_test_steps[i].param_num,test_joypads[targetpad].button_state); } else if( input_test_steps[i].action >= JOYPAD_TEST_COMMAND_BUTTON_AXIS_FIRST && @@ -457,19 +457,19 @@ static void test_joypad_poll(void) test_joypads[targetpad].axis_state[targetaxis] = (int16_t) input_test_steps[i].param_num; else RARCH_WARN( - "[Test input driver]: Decoded axis outside target range: action %d pad %d axis %d.\n", + "[Test joypad driver]: Decoded axis outside target range: action %d pad %d axis %d.\n", input_test_steps[i].action, targetpad, targetaxis); input_test_steps[i].handled = true; RARCH_DBG( - "[Test input driver]: Setting axis device %d axis %d value %d.\n", + "[Test joypad driver]: Setting axis device %d axis %d value %d.\n", targetpad, targetaxis, (int16_t)input_test_steps[i].param_num); } else { input_test_steps[i].handled = true; RARCH_WARN( - "[Test input driver]: Unrecognized action %d in step %d, skipping\n", + "[Test joypad driver]: Unrecognized action %d in step %d, skipping\n", input_test_steps[i].action,i); } diff --git a/input/input_driver.c b/input/input_driver.c index 35a7c13b577..4230608e9c2 100644 --- a/input/input_driver.c +++ b/input/input_driver.c @@ -47,16 +47,17 @@ #include "../accessibility.h" #include "../command.h" #include "../config.def.keybinds.h" -#include "../driver.h" -#include "../retroarch.h" -#include "../verbosity.h" #include "../configuration.h" +#include "../driver.h" +#include "../frontend/frontend_driver.h" #include "../list_special.h" #include "../performance_counters.h" +#include "../retroarch.h" #ifdef HAVE_BSV_MOVIE #include "../tasks/task_content.h" #endif #include "../tasks/tasks_internal.h" +#include "../verbosity.h" #define HOLD_BTN_DELAY_SEC 2 @@ -367,6 +368,9 @@ input_driver_t *input_drivers[] = { #endif #ifdef DJGPP &input_dos, +#endif +#ifdef HAVE_TEST_DRIVERS + &input_test, #endif &input_null, NULL, @@ -1103,7 +1107,7 @@ const char **input_keyboard_start_line( } #ifdef HAVE_OVERLAY -static int16_t input_overlay_mouse_state(input_overlay_t *ol, unsigned id) +static int16_t input_overlay_device_mouse_state(input_overlay_t *ol, unsigned id) { input_overlay_pointer_state_t *ptr_st = &ol->pointer_state; int16_t res; @@ -1218,10 +1222,9 @@ static int16_t input_overlay_lightgun_state(settings_t *settings, } static int16_t input_overlay_pointer_state(input_overlay_t *ol, + input_overlay_pointer_state_t *ptr_st, unsigned idx, unsigned id) { - input_overlay_pointer_state_t *ptr_st = &ol->pointer_state; - ptr_st->device_mask |= (1 << RETRO_DEVICE_POINTER); switch (id) @@ -1248,14 +1251,16 @@ static int16_t input_overlay_pointing_device_state(settings_t *settings, switch (device) { case RETRO_DEVICE_MOUSE: - return input_overlay_mouse_state(ol, id); + return input_overlay_device_mouse_state(ol, id); case RETRO_DEVICE_LIGHTGUN: if ( settings->ints.input_overlay_lightgun_port == -1 || settings->ints.input_overlay_lightgun_port == (int)port) return input_overlay_lightgun_state(settings, ol, id); break; case RETRO_DEVICE_POINTER: - return input_overlay_pointer_state(ol, idx, id); + return input_overlay_pointer_state(ol, + (input_overlay_pointer_state_t*)&ol->pointer_state, + idx, id); default: break; } @@ -3038,14 +3043,15 @@ static void input_overlay_get_mouse_scale(settings_t *settings, * Updates button state of the overlay mouse. */ static void input_overlay_poll_mouse(settings_t *settings, - input_overlay_t *ol, const int old_ptr_count) + struct input_overlay_mouse_state *mouse_st, + input_overlay_t *ol, + const int ptr_count, + const int old_ptr_count) { input_overlay_pointer_state_t *ptr_st = &ol->pointer_state; - struct input_overlay_mouse_state *mouse_st = &ptr_st->mouse; const retro_time_t now_usec = cpu_features_get_time_usec(); const retro_time_t hold_usec = settings->uints.input_overlay_mouse_hold_msec * 1000; const retro_time_t dtap_usec = settings->uints.input_overlay_mouse_dtap_msec * 1000; - const int ptr_count = ptr_st->count; int swipe_thres_x = 0; int swipe_thres_y = 0; const bool hold_to_drag = settings->bools.input_overlay_mouse_hold_to_drag; @@ -3437,28 +3443,32 @@ static void input_poll_overlay( if (ol_ptr_enable) { + input_overlay_pointer_state_t *ptr_st = &ol->pointer_state; + struct input_overlay_mouse_state *mouse_st = (struct input_overlay_mouse_state*)&ptr_st->mouse; + if (ptr_state->device_mask & (1 << RETRO_DEVICE_LIGHTGUN)) input_overlay_poll_lightgun(settings, ol, old_ptr_count); if (ptr_state->device_mask & (1 << RETRO_DEVICE_MOUSE)) - input_overlay_poll_mouse(settings, ol, old_ptr_count); + input_overlay_poll_mouse(settings, mouse_st, ol, + ptr_st->count, old_ptr_count); ptr_state->device_mask = 0; } - if ( OVERLAY_GET_KEY(ol_state, RETROK_LSHIFT) || - OVERLAY_GET_KEY(ol_state, RETROK_RSHIFT)) + if ( OVERLAY_GET_KEY(ol_state, RETROK_LSHIFT) + || OVERLAY_GET_KEY(ol_state, RETROK_RSHIFT)) key_mod |= RETROKMOD_SHIFT; - if ( OVERLAY_GET_KEY(ol_state, RETROK_LCTRL) || - OVERLAY_GET_KEY(ol_state, RETROK_RCTRL)) + if ( OVERLAY_GET_KEY(ol_state, RETROK_LCTRL) + || OVERLAY_GET_KEY(ol_state, RETROK_RCTRL)) key_mod |= RETROKMOD_CTRL; - if ( OVERLAY_GET_KEY(ol_state, RETROK_LALT) || - OVERLAY_GET_KEY(ol_state, RETROK_RALT)) + if ( OVERLAY_GET_KEY(ol_state, RETROK_LALT) + || OVERLAY_GET_KEY(ol_state, RETROK_RALT)) key_mod |= RETROKMOD_ALT; - if ( OVERLAY_GET_KEY(ol_state, RETROK_LMETA) || - OVERLAY_GET_KEY(ol_state, RETROK_RMETA)) + if ( OVERLAY_GET_KEY(ol_state, RETROK_LMETA) + || OVERLAY_GET_KEY(ol_state, RETROK_RMETA)) key_mod |= RETROKMOD_META; /* CAPSLOCK SCROLLOCK NUMLOCK */ @@ -4424,11 +4434,24 @@ bool video_driver_init_input( void *new_data = NULL; input_driver_t **input = &input_driver_st.current_driver; if (*input) +#if HAVE_TEST_DRIVERS + if (strcmp(settings->arrays.input_driver,"test") != 0) + /* Test driver not in use, keep selected driver */ + return true; + else if (string_is_empty(settings->paths.test_input_file_general)) + { + RARCH_LOG("[Input]: Test input driver selected, but no input file provided - falling back.\n"); + return true; + } + else + RARCH_LOG("[Video]: Graphics driver initialized an input driver, but ignoring it as test input driver is in use.\n"); +#else return true; - - /* Video driver didn't provide an input driver, - * so we use configured one. */ - RARCH_LOG("[Video]: Graphics driver did not initialize an input driver." +#endif + else + /* Video driver didn't provide an input driver, + * so we use configured one. */ + RARCH_LOG("[Video]: Graphics driver did not initialize an input driver." " Attempting to pick a suitable driver.\n"); if (tmp) diff --git a/input/input_driver.h b/input/input_driver.h index ef4276020ce..6072fd3affb 100644 --- a/input/input_driver.h +++ b/input/input_driver.h @@ -1104,6 +1104,7 @@ extern input_driver_t input_emulatorjs; extern input_driver_t input_dos; extern input_driver_t input_winraw; extern input_driver_t input_wayland; +extern input_driver_t input_test; extern input_device_driver_t dinput_joypad; extern input_device_driver_t linuxraw_joypad; diff --git a/intl/googleplay_ast.json b/intl/googleplay_ast.json index fdecf9c24ab..bb9186295a3 100644 --- a/intl/googleplay_ast.json +++ b/intl/googleplay_ast.json @@ -1,4 +1,4 @@ { - "main-desc": "RetroArch ye un proyeutu de códigu llibre qu'usa Libretro, una interfaz de desendolcu poderosa. Libretro permítete facer aplicaciones multiplataforma qu'usen carauterístiques como OpenGL, Vulkan y otres munches que van incluyise nel futuru.\n\nVien cola so coleición integrada d'aplicaciones pa fornite un centru d'entretenimientu nel intre.\n\nLibretro y Retroarch valen perfeutamente pa crear xuegos, emuladores y programes multimedia. Si quies deprender más, vete al nuesu sitiu web (llístase embaxo)\n¡¡¡IMPORTANTE!!!\n\nRetroarch ye un programa modular, quier dicir que pa facer cualesquier cosa precises programes llamaos nucleos. Estos nucleos NUN S'INCLÚIN DE FÁBRICA pero pa baxalos vete a «Anovador en llinia -> Anovador de nucleos» dientro de l'aplicación.\n\nCARAUTERÍSTIQUES:\n*¡Una escoyeta de menús guapos!\n*¡Escanéu de ficheros/direutorios p'amestalos a coleiciones!\n*¡Amuesa de la información de cada xuegu namás amestalu a una coleición!\n*Descarga de programes (nucleos) en llinia\n*¡Anovamientu de tolos componentes!\n*¡Descarga de xuegos de Game & Watch pa xugalos nel nuesu emulador esclusivu de Game & Watch!\n*Mapéu integráu de controles y mandos\n*Xestión de trampes\n*¡Traducciones a otres llingües!\n*¡Más de 80 programes (nucleos) y contando!\n*¡Partíes en llinia con NetPlay!\n*¡Fechura de captures, puntos de guardáu y más!\n\n*Ensin DRM\n*Ensin torgues d'usu\n*Códigu abiertu\n*Ensin programes espía\n*Ensin anuncios\n\nXúnite al nuesu Discord pa consiguir sofitu y entamar partíes per NetPlay\nhttps://discord.gg/C4amCeV\n\n¡Visita la nuesa canal de YouTube pa tutoriales, noticies y muncho más!\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube.com/RetroArchOfficial\n\nPa más información y ayuda, mira la nuesa documentación\nhttps://docs.libretro.com/\n\nVisita'l nuesu sitiu web\nhttps://www.retroarch.com/\n\nwww.libretro.com", + "main-desc": "Retroarch ye un proyeutu de códigu abiertu qu'usa la interfaz de desendolcu Libretro. Libretro ye una interfaz potente que te permite crear aplicaciones multiplataforma que puen usar funciones arriquecíes como OpenGL, la compatibilidá de cámara multiplataforma y munches más nel futuru.\n\nVien cola so coleición integrada d'aplicaciones pa fornite un centru únicu d'entretenimientu.\n\nLibretro y RetroArch son afayadizos pa crear xuegos, emuladores y programes multimedia. Si quies saber más, vete al nuesu sitiu web (indícase abaxo).\n¡¡¡IMPORTANTE!!!\n\nRetroArch ye un programa polivalente, ye dicir, que pa que faiga daqué, precises módulos que llamaos «nucleos». Estos nucleos NUN S'INCLÚIN DE SERIE, tienes de dir a «Anovador -> Anovador de Nucleos» dientro de l'aplicación pa baxalos.\n\nFUNCIONES:\n* Una seleición de menús guapos\n* Busca de ficheros/direutorios p'amestalos a les coleiciones de los sistemes de xuegu\n* Visualización de la información de les bases de datos de cada xuegu namás que los amiestes a una coleición\n* Descarga de programes (nucleos) en llinia\n* Anovamientu de tol conteníu\n* Descarga de xuegos Game & Watch pa que los xuegues nel nuesu emulador de Game & Watch esclusivu\n* Remapéu de la entrada integráu\n* Capacidá pa remapiar los controles\n* Capacidá d'introducir y cargar trampes\n* Compatibilidá con munches llingües\n* Más de 80 programes, ¡y caldía más!\n* Partíes multixugador col xuegu en llinia\n* Puntos de guardáu\n* Y muncho más\n\n* Ensin DRM\n* Ensin restricciones d'usu\n* De códigu abiertu\n* Ensin anuncios\n* Ensin spyware\n\nXúnite al sirvidor de Discord pa consiguir sofitu y empareyamientos pal xuegu en llinia (n'inglés)\nhttps://discord.gg/C4amCeV\n\nVisita la nuesa canal de Youtube pa ver tutoriales, partíes, noticies y cómo progresa'l desendolcu (n'inglés)\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube.com/RetroArchOfficial\n\nPa consiguir más información y ayuda, consulta'l sitiu de la documentación (n'inglés)\nhttps://docs.libretro.com/\n\n¡Visita'l sitiu web! (n'inglés)\nhttps://www.retroarch.com/\n\nwww.libretro.com", "short-desc": "¡Xuegos retro y emuladores nel to preséu!" } diff --git a/intl/googleplay_be.json b/intl/googleplay_be.json index f68a4d93183..98d8075d1ec 100644 --- a/intl/googleplay_be.json +++ b/intl/googleplay_be.json @@ -1,4 +1,4 @@ { - "main-desc": "RetroArch is an open-source project that makes use of a powerful development interface called Libretro. Libretro is an interface that allows you to make cross-platform applications that can use rich features such as OpenGL, cross-platform camera support, location support, and more in the future.\n\nIt comes with its own built-in collection of applications to provide you with a 'one-stop-shop' for entertainment.\n\nLibretro and RetroArch are perfectly suited for creating games, emulators and multimedia programs. If you want to learn more, go to our website (listed below).\nIMPORTANT!!!\n\nRetroArch is a multi-versatile program, that means that in order for it to do anything, you need modular programs that we call 'cores'. These cores DO NOT COME OUT OF THE BOX. You need to go to \"Online Updater -> Core Updater\" from within the app to download them.\n\nFEATURES:\n* Eye-candy menus to choose from!\n* Scan files / directories and add them to game system collections!\n* View database information about each game once added to a collection!\n* Download programs ('cores') online\n* Update everything!\n* Download Game & Watch games and play them with our exclusive Game & Watch emulator!\n* Built-in input remapping\n* Ability to remap controls\n* Ability to enter and load cheats\n* Multi-language support!\n* Over 80+ programs('cores') now and counting!\n* Play multiplayer with NetPlay!\n* Take screenshots, save states and more!\n\n* No DRM\n* No restrictions on usage\n* Open-source\n* No push ads\n* No spying\n* No ads period\n\nJoin us on discord for support and netplay matchmaking\nhttps://discord.gg/C4amCeV\n\nVisit our Youtube channel here for tutorials, gameplays, news and development progress!\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube.com/RetroArchOfficial\n\nFor info and help, see our documentation site -\nhttps://docs.libretro.com/\n\nVisit our website!\nhttps://www.retroarch.com/\n\nwww.libretro.com", - "short-desc": "Retro games and emulators on your device!" + "main-desc": "RetroArch – гэта праект з адкрытым зыходным кодам на аснове магутнага інтэрфейсу распрацоўкі Libretro. Інтэрфейс Libretro дазваляе ствараць крос-платформавыя прыкладанні з доступам да шырокага выбару функцый, які ўключае OpenGL, падтрымку камер, вызначэнне месцазнаходжання і шматлікіх іншых.\n\nУбудаваная калекцыя прыкладанняў дае карыстальнікам адзінае рашэнне для забаўляльных мэт.\n\nLibretro і RetroArch – гэта ідэальнае рашэнне для стварэння гульняў, эмулятараў і мультымедыйных праграм. Для атрымання дадатковай інфармацыі наведайце наш сайт (гл. ніжэй).\n\nАСАБЛІВАСЦІ:\n* Прыгожыя меню на ваш выбар!\n* Скануйце файлы/каталогі і дадавайце іх у калекцыі гульнявых сістэм!\n* Праглядайце інфармацыю ў базах дадзеных па любой гульні ў калекцыі!\n* Спампоўвайце праграмы ('ядра') анлайн\n* Абнаўляйце ўсё!\n* Спампоўвайце і запускайце гульні Game & Watch на нашым эксклюзіўным эмулятары!\n* Убудаваныя профілі прылад уводу\n* Магчымасць змены схемы кіравання\n* Магчымасць стварэння і загрузкі чыт-кодаў\n* Мультымоўны інтэрфейс!\n* Больш за 80 праграм ('ядраў') і гэта не мяжа!\n* Гуляйце па сетцы з дапамогай NetPlay!\n* Рабіце скрыншоты, хуткія захаванні і многае іншае!\n\n* Без DRM\n* Без абмежаванняў на выкарыстанне\n* Адкрыты праграмны код\n* Без push-паведамленняў\n* Без сачэння\n* Без рэкламы\n\nДалучайцеся да Discord для атрымання падтрымкі і пошуку сеткавых апанентаў\nhttps://discord. g/C4amCeV\n\nНаведайце нашы каналы на Youtube для прагляду відэаінструкцый, запісаў геймплэя, навін і справаздач аб распрацоўцы!\nhttps://www.youtube.com/user/libretro\nhttps://www.youtube. om/RetroArchOfficial\n\nДля атрымання інфармацыі і дапамогі наведайце сайт з дакументацыяй -\nhttps://docs.libretro.com/\n\nЗаходзьце на наш вэбсайт!\nhttps://www.retroarch.com/\n\nwww.libretro.com", + "short-desc": "Эмуляцыя рэтра гульняў на вашай прыладзе!" } diff --git a/intl/msg_hash_ast.h b/intl/msg_hash_ast.h index f6153535182..0f16326def9 100644 --- a/intl/msg_hash_ast.h +++ b/intl/msg_hash_ast.h @@ -44,6 +44,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_EXPLORE_TAB, "Esploración" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENTLESS_CORES_TAB, + "Nucleos ensin conteníu" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_TAB, "Importación de conteníu" @@ -99,7 +103,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ADD_CONTENT_LIST, - "Importación" + "Importación de conteníu" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_ADD_CONTENT_LIST, + "Crea y anueva llistes pente la busca de conteníu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ONLINE_UPDATER, @@ -113,6 +121,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY, "Xuegu en llinia" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY, + "Xúnite a una sesión de xuegu en llinia o agospia una." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SETTINGS, "Configuración" @@ -177,7 +189,7 @@ MSG_HASH( /* FIXME Maybe add a description? */ MSG_HASH( MENU_ENUM_LABEL_VALUE_FAVORITES, - "Direutoriu d'aniciu" + "Direutoriu inicial" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DOWNLOADED_FILE_DETECT_CORE_LIST, @@ -200,7 +212,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_GOTO_MUSIC, - "Equí apaez les canciones que se reproduxeren anteriormente." + "Equí apaecen les canciones que se reproduxeren anteriormente." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_GOTO_IMAGES, @@ -208,7 +220,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_GOTO_IMAGES, - "Equí apaecen les imáxenes que se vieren anteriormente." + "Equí apaecen les imáxenes que se visualizaren anteriormente." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_GOTO_VIDEO, @@ -226,6 +238,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_GOTO_EXPLORE, "Restola tol conteníu que concase cola base de datos per una interfaz de busca per estayes." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_GOTO_CONTENTLESS_CORES, + "Nucleos ensin conteníu" + ) MSG_HASH( MENU_ENUM_SUBLABEL_GOTO_CONTENTLESS_CORES, "Equí apaecen los nucleos instalaos que puen funcionar ensin cargar conteníu." @@ -237,6 +253,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_UPDATER_LIST, "Baxador de nucleos" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_INSTALLED_CORES, + "Anovar los nucleos instalaos" + ) MSG_HASH( MENU_ENUM_SUBLABEL_UPDATE_INSTALLED_CORES, "Anueva tolos nucleos instalaos a la última versión disponible." @@ -257,13 +277,17 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DOWNLOAD_CORE_CONTENT, "Baxador de conteníu" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_UPDATE_CORE_INFO_FILES, + "Anovar los ficheros d'información de los nucleos" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UPDATE_ASSETS, "Anovar los gráficos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UPDATE_AUTOCONFIG_PROFILES, - "Anovar los perfiles de mandos" + "Anovar los perfiles de los mandos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_UPDATE_CHEATS, @@ -292,6 +316,14 @@ MSG_HASH( /* Main Menu > Information */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFORMATION, + "Información del nucleu" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CORE_INFORMATION, + "Visualiza la información relativa a l'aplicación/nucleu." + ) MSG_HASH( MENU_ENUM_SUBLABEL_DISC_INFORMATION, "Visualiza la información de los discos multimedia inxertaos." @@ -373,7 +405,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_LOCK, - "Bloquiar el nucléu instaláu" + "Bloquiar el nucleu instaláu" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_DELETE, @@ -396,7 +428,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_GIT_VERSION, - "Versión de git" + "Versión de Git" ) MSG_HASH( /* FIXME Should be MENU_LABEL_VALUE */ MSG_COMPILER, @@ -424,7 +456,7 @@ MSG_HASH( /* FIXME Maybe add a description? */ ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_POWER_SOURCE, - "Fonte enerxética" + "Fonte d'enerxía" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_VIDEO_CONTEXT_DRIVER, @@ -731,9 +763,21 @@ MSG_HASH( /* Main Menu > Configuration File */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_CURRENT_CONFIG, + "Guardar la configuración actual" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVE_NEW_CONFIG, + "Guardar la configuración nueva" + ) /* Main Menu > Help */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_HELP_CONTROLS, + "Controles básicos del menú" + ) /* Main Menu > Help > Basic Menu Controls */ @@ -753,6 +797,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_INFO, "Información" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_START, + "Aniciar" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_TOGGLE_MENU, "Alternar el menú" @@ -774,16 +822,12 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_DRIVER_SETTINGS, - "Cambia los controladores usaos pol sistema." + "Camuda los controladores usaos pol sistema." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SETTINGS, "Videu" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_SETTINGS, - "Camuda los axustes de la salida del videu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_SETTINGS, "Audiu" @@ -802,7 +846,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_CONFIGURATION_SETTINGS, - "Camuda los axustes predeterminaos de los ficheros de configuración." + "Camuda les opciones predeterminaes de los ficheros de configuración." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVING_SETTINGS, @@ -810,7 +854,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_SAVING_SETTINGS, - "Camuda los axustes de guardáu." + "Camuda la configuración del guardáu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SETTINGS, @@ -846,12 +890,28 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_LOGGING_SETTINGS, - "Camuda los axustes de rexistru." + "Camuda la configuración del rexistru." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, "Restolador de ficheros" ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CONFIG, + "Ficheru de configuración." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_CONFIG, + "Ficheru de configuración." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_CHEAT, + "Ficheru de trampes." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_FILE_BROWSER_PLAIN_FILE, + "Ficheru ensin formatu." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORDING_SETTINGS, "Grabación" @@ -860,6 +920,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_RECORDING_SETTINGS, "Camuda los axustes de grabación." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USER_INTERFACE_SETTINGS, + "Interfaz d'usuariu" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_AI_SERVICE_SETTINGS, "Serviciu d'IA" @@ -870,11 +934,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_POWER_MANAGEMENT_SETTINGS, - "Xestión enerxética" + "Xestión d'enerxía" ) MSG_HASH( MENU_ENUM_SUBLABEL_POWER_MANAGEMENT_SETTINGS, - "Camuda los axustes de la xestión enerxética." + "Camuda la configuración de la xestión d'enerxía." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RETRO_ACHIEVEMENTS_SETTINGS, @@ -882,7 +946,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_RETRO_ACHIEVEMENTS_SETTINGS, - "Camuda los axustes de los llogros." + "Camuda los configuración de los llogros." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETWORK_SETTINGS, @@ -894,7 +958,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_PLAYLIST_SETTINGS, - "Camuda los axustes de les llistes." + "Camuda la configuración de les llistes." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_SETTINGS, @@ -902,7 +966,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DIRECTORY_SETTINGS, - "Direutoriu" + "Direutorios" ) /* Core option category placeholders for icons */ @@ -934,6 +998,10 @@ MSG_HASH( "Audiu" ) #ifdef HAVE_MICROPHONE +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MICROPHONE_DRIVER, + "Micrófonu" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, @@ -958,10 +1026,6 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_OUTPUT_SETTINGS, "Salida" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_OUTPUT_SETTINGS, - "Camuda los axustes de la salida del videu." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_MODE_SETTINGS, "Mou a pantalla completa" @@ -987,11 +1051,19 @@ MSG_HASH( "Filtru billinial" ) #if defined(DINGUX) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BICUBIC, + "Bicúbicu" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_FILTER_BILINEAR, "Billinial" ) #if defined(RS90) || defined(MIYOO) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_RS90_SOFTFILTER_BRESENHAM_HORZ, + "Semillinial" + ) #endif #endif MSG_HASH( @@ -1021,11 +1093,11 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_X, - "Anchor a pantalla completa" + "Llargor de la pantalla completa" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_FULLSCREEN_Y, - "Altor a pantalla completa" + "Altor de la pantalla completa" ) /* Settings > Video > Windowed Mode */ @@ -1040,7 +1112,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_WIDTH, - "Anchor de la ventana" + "Llargor de la ventana" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_WINDOW_HEIGHT, @@ -1055,7 +1127,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_INDEX, - "Proporción del aspeutu" + "Proporción d'aspeutu" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_ASPECT_RATIO_CONFIG, @@ -1064,7 +1136,7 @@ MSG_HASH( #if defined(DINGUX) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_DINGUX_IPU_KEEP_ASPECT, - "Caltener la proporción del aspeutu" + "Caltener la proporción d'aspeutu" ) #endif #if defined(RARCH_MOBILE) @@ -1094,11 +1166,11 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_OUTPUT_SETTINGS, "Salida" ) +#ifdef HAVE_MICROPHONE MSG_HASH( - MENU_ENUM_SUBLABEL_AUDIO_OUTPUT_SETTINGS, - "Camuda los axustes de la salida del audiu." + MENU_ENUM_LABEL_VALUE_MICROPHONE_SETTINGS, + "Micrófonu" ) -#ifdef HAVE_MICROPHONE #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_AUDIO_SYNCHRONIZATION_SETTINGS, @@ -1110,7 +1182,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_MIXER_SETTINGS, - "Camuda los axustes del mecedor d'audiu." + "Camuda la configuración del mecedor d'audiu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SOUNDS, @@ -1122,7 +1194,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_WASAPI_EXCLUSIVE_MODE, - "Permite que'l controlador WASAPI tome'l control esclusivu del preséu d'audiu. Si se desactiva, va usase'l mou compartíu." + "Permite que'l controlador WASAPI tome'l control esclusivu del preséu d'audiu. Si se desactiva esta opción, va usase'l mou compartíu." ) /* Settings > Audio > Output */ @@ -1138,6 +1210,10 @@ MSG_HASH( #ifdef HAVE_MICROPHONE /* Settings > Audio > Input */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MICROPHONE_ENABLE, + "Micrófonu" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MICROPHONE_DEVICE, "Preséu" @@ -1159,7 +1235,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_AUDIO_RATE_CONTROL_DELTA, - "Ayuda a amenorgar les imperfeiciones na sincronización del audiu y videu. Ten curiáu si esta opción ta desactivada, la sincronización afayadiza ye imposible de consiguir." + "Ayuda a amenorgar les imperfeiciones na sincronización del audiu y videu. Ten curiáu si esta opción ta desactivada, la sincronización afayadiza ye cuasi imposible de consiguir." ) /* Settings > Audio > MIDI */ @@ -1249,22 +1325,22 @@ MSG_HASH( #endif #ifdef ANDROID #endif -MSG_HASH( - MENU_ENUM_LABEL_VALUE_INPUT_SENSORS_ENABLE, - "Entrada de los sensores auxiliares" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_OFF, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_ON, - "SÍ" + "Sí" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_AUTO_GAME_FOCUS_DETECT, "Detectar" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PAUSE_ON_DISCONNECT, + "Posar el conteníu cuando'l mandu se desconecte" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_HOTKEY_BINDS, "Atayos" @@ -1365,19 +1441,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_B, - "Botón B (Abaxo)" + "Botón B (abaxo)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_Y, - "Botón Y (Esquierda)" + "Botón Y (esquierda)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_A, - "Botón A (Derecha)" + "Botón A (derecha)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_JOYPAD_X, - "Botón X (Arriba)" + "Botón X (arriba)" ) /* Settings > Latency */ @@ -1387,7 +1463,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_SUBLABEL_DUMMY_ON_CORE_SHUTDOWN, - "Dalgunos nucleos tienen una función d'apagáu, la carga d'un nucleu maniquín evita que RetroArch cole." + "Dalgunos nucleos tienen una función d'apagáu, la carga d'un nucleu maniquín impide que RetroArch cole." ) #ifndef HAVE_DYNAMIC #endif @@ -1404,6 +1480,10 @@ MSG_HASH( +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_CORE_MANAGER_STEAM, + "Amosar la opción «Xestionar nucleos»" +) @@ -1517,7 +1597,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_SCREENSHOT_FLASH_NORMAL, - "SÍ (normal)" + "Sí (normal)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_WHEN_MENU_IS_ALIVE, @@ -1533,11 +1613,23 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_X, - "Posición de los avisos (Horizontal)" + "Posición de los avisos (horizontal)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_POS_Y, - "Posición de los avisos (Vertical)" + "Posición de los avisos (vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_RED, + "Color de los avisos (coloráu)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_GREEN, + "Color de los avisos (verde)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_COLOR_BLUE, + "Color de los avisos (azul)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_MESSAGE_BGCOLOR_ENABLE, @@ -1582,7 +1674,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PAUSE_LIBRETRO, - "Posar el conteníu al tar activu'l menú" + "Posar el conteníu cuando'l menú ta activu" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_SAVESTATE_RESUME, @@ -1590,7 +1682,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_SNOW, - "Ñeve" + "Nieve" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_STARFIELD, @@ -1600,10 +1692,34 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SCREENSAVER_ANIMATION_VORTEX, "Vórtiz" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MOUSE_ENABLE, + "Compatibilidá con mures" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MOUSE_ENABLE, + "Permite que'l menú se controle con un mur." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_POINTER_ENABLE, + "Compatibilidá con pantalles táctiles" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_POINTER_ENABLE, + "Permite que'l menú se controle con una pantalla táctil." + ) MSG_HASH( MENU_ENUM_SUBLABEL_THREADED_DATA_RUNLOOP_ENABLE, "Fai xeres nun filu separtáu." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PAUSE_NONACTIVE, + "Posar el conteníu cuando nun ta activu" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PAUSE_NONACTIVE, + "Posa'l conteníu cuando RetroArch nun ye la ventana activa." + ) /* Settings > User Interface > Menu Item Visibility */ @@ -1615,8 +1731,52 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SETTINGS_VIEWS_SETTINGS, "Configuración" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CORE, + "Amosar la opción «Cargar un nucleu»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT, + "Amosar la opción «Cargar conteníu»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_DISC, + "Amosar la opción «Cargar un discu»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_DUMP_DISC, + "Amosar la opción «Volquiar el discu»" + ) #ifdef HAVE_LAKKA +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_EJECT_DISC, + "Amosar la opción «Espulsar el discu»" + ) #endif +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_ONLINE_UPDATER, + "Amosar la opción «Anovador»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_INFORMATION, + "Amosar la opción «Información»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_CONFIGURATIONS, + "Amosar la opción «Ficheru de configuración»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_HELP, + "Amosar la opción «Ayuda»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_QUIT_RETROARCH, + "Amosar la opción «Colar de RetroArch»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_RESTART_RETROARCH, + "Amosar la opción «Reaniciar RetroArch»" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_ADD_CONTENT_ENTRY_DISPLAY_MAIN_TAB, "Menú principal" @@ -1636,6 +1796,10 @@ MSG_HASH( /* Settings > User Interface > Menu Item Visibility > Quick Menu */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_QUICK_MENU_SHOW_INFORMATION, + "Amosar la opción «Información»" + ) /* Settings > User Interface > Views > Settings */ @@ -1651,6 +1815,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_WALLPAPER_OPACITY, "Opacidá del fondu" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_FRAMEBUFFER_OPACITY, + "Opacidá" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_USE_PREFERRED_SYSTEM_COLOR_THEME, "Usar l'estilu de colores preferíu pol sistema" @@ -1677,6 +1845,10 @@ MSG_HASH( /* Settings > Accessibility */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_ACCESSIBILITY_ENABLED, + "Activar l'accesibilidá" + ) /* Settings > Power Management */ @@ -1713,12 +1885,20 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_APPEARANCE_SETTINGS, "Aspeutu" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CHEEVOS_APPEARANCE_ANCHOR, + "Posición" + ) /* Settings > Achievements > Visibility */ /* Settings > Network */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_MITM_SERVER_LOCATION_2, + "Europa occidental" + ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_IP_ADDRESS, "La direición del agospiador al que conectase." @@ -1739,6 +1919,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ALLOW_PAUSING, "Permitir la posa" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, + "Al agospiar, esta opción tenta de detectar les conexones d'internet con UPnP o teunoloxíes asemeyaes pa escapar de les LANs." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETWORK_CMD_ENABLE, + "Comandos per rede" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_STDIN_CMD_ENABLE, "Comandos de la entrada estándar" @@ -1899,7 +2087,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_SUBLABEL_ACCOUNTS_RETRO_ACHIEVEMENTS, - "Gana llogros en xuegos clásicos. Pa consiguir más información, visita «https://retroachievements.org»." + "Gana llogros en xuegos clásicos. Pa consiguir más información, visita«https://retroachievements.org»." ) /* Settings > User > Accounts > RetroAchievements */ @@ -1925,21 +2113,21 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_YOUTUBE_STREAM_KEY, - "Clave de tresmisión de YouTube" + "Clave d'emisión de YouTube" ) /* Settings > User > Accounts > Twitch */ MSG_HASH( MENU_ENUM_LABEL_VALUE_TWITCH_STREAM_KEY, - "Clave de tresmisión de Twitch" + "Clave d'emisión de Twitch" ) /* Settings > User > Accounts > Facebook Gaming */ MSG_HASH( MENU_ENUM_LABEL_VALUE_FACEBOOK_STREAM_KEY, - "Clave de tresmisión de Facebook Gaming" + "Clave d'emisión de Facebook Gaming" ) /* Settings > Directory */ @@ -1974,7 +2162,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LIBRETRO_INFO_PATH, - "Información de nucelos" + "Información de los nucleos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_DATABASE_DIRECTORY, @@ -2041,9 +2229,13 @@ MSG_HASH( /* Import Content */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCAN_FILE, + "Buscar un ficheru" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_LIST, - "Escanéu manual" + "Busca manual" ) /* Import Content > Scan File */ @@ -2051,6 +2243,10 @@ MSG_HASH( /* Import Content > Manual Scan */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_DIR, + "Direutoriu del conteníu" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SYSTEM_NAME, "Nome del sistema" @@ -2065,15 +2261,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_SEARCH_ARCHIVES, - "Escaniar dientro de los ficheros" + "Buscar dientro de los ficheros" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MANUAL_CONTENT_SCAN_START, - "Aniciar l'escanéu" + "Aniciar la busca" ) MSG_HASH( MENU_ENUM_SUBLABEL_MANUAL_CONTENT_SCAN_START, - "Escania'l conteníu esbilláu." + "Busca'l conteníu seleicionáu." ) /* Explore tab */ @@ -2139,7 +2335,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_EXPLORE_BY_ARTSTYLE, - "Pol estilu gráficu" + "Pol estilu artísticu" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_EXPLORE_BY_NARRATIVE, @@ -2396,31 +2592,39 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_CORES_AVAILABLE, - "Nun hai nucleos disponibles" + "Nun hai nengún nucleu disponible" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_FAVORITES_AVAILABLE, - "Nun hai favoritos disponibles" + "Nun hai nengún elementu favoritu disponible" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_HISTORY_AVAILABLE, + "L'historial nun ta disponible" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_IMAGES_AVAILABLE, - "Nun hai imáxenes disponibles" + "Nun hai nenguna imaxe disponible" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_MUSIC_AVAILABLE, - "Nun hai música disponible" + "Nun hai nenguna canción disponible" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_VIDEOS_AVAILABLE, - "Nun hai vídeos disponibles" + "Nun hai nengún videu disponible" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_INFORMATION_AVAILABLE, "Nun hai información disponible" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NO_PLAYLIST_ENTRIES_AVAILABLE, + "Nun hai nenguna entrada de la llista" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_SETTINGS_FOUND, - "Nun s'atoparon los axustes" + "Nun s'atopó nenguna opción" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_BT_DEVICES_FOUND, @@ -2436,7 +2640,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SEARCH, - "Buscar" + "Busca" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CYCLE_THUMBNAILS, + "Percorrer les miniatures" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_BACK, @@ -2499,7 +2707,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_ENTRY_REMOVE_ENABLE_NONE, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_INLINE_CORE_DISPLAY_HIST_FAV, @@ -2529,17 +2737,21 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_DOWN_Y_L_R, "Abaxo + Y + L1 + R1" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DOWN_SELECT, + "Abaxo + Select" + ) MSG_HASH( MENU_ENUM_LABEL_CHEAT_HANDLER_TYPE_EMU, "Emulador" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_ON, - "SÍ" + "Sí" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_OFF, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_YES, @@ -2642,7 +2854,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_ASPECT_RATIO, - "Proporción del aspeutu" + "Proporción d'aspeutu" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_RGUI_PARTICLE_EFFECT, @@ -2662,7 +2874,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_RGUI_EXTENDED_ASCII, - "Activa l'amuesa de caráuteres ASCII que nun son estándar. Ríquese pa la compatibilidá con ciertes llingües occidentales distintes al inglés. Tien un impautu moderáu nel rindimientu." + "Activa la visualización de caráuteres ASCII que nun son estándar. Esta opción ye obligatoria pa consiguir compatibilidá con ciertes llingües occidentales que nun son l'inglés. Tien un impautu moderáu nel rindimientu." ) /* RGUI: Settings Options */ @@ -2673,7 +2885,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_NONE, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_ASPECT_RATIO_LOCK_INTEGER, @@ -2745,7 +2957,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_NONE, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RGUI_PARTICLE_EFFECT_RAIN, @@ -2784,14 +2996,14 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_XMB_MAIN_MENU_ENABLE_SETTINGS, - "Amuesa la llingüeta Axustes que contién la configuración del programa." + "Amuesa la llingüeta «Configuración» que contién la configuración del programa." ) /* XMB: Settings Options */ MSG_HASH( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOW, - "Ñeve" + "Nieve" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SHADER_PIPELINE_SNOWFLAKE, @@ -2879,6 +3091,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_ICONS_ENABLE, "N'iconos" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MATERIALUI_SHOW_NAV_BAR, + "Amosar la barra de navegación" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_THUMBNAILS_MATERIALUI, "Miniatura primaria" @@ -2920,11 +3136,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_MENU_TRANSITION_ANIM_NONE, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DISABLED, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_PORTRAIT_DUAL_ICON, @@ -2932,15 +3148,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_THUMBNAIL_VIEW_LANDSCAPE_DISABLED, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_DISABLED, - "NON" + "Non" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MATERIALUI_LANDSCAPE_LAYOUT_OPTIMIZATION_ALWAYS, - "SÍ" + "Sí" ) /* Qt (Desktop Menu) */ @@ -2995,7 +3211,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_TITLE, - "Axustes" + "Configuración" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_TOOLS, @@ -3019,7 +3235,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_LOAD_CORE, - "Carga d'un nucleu" + "Cargar un nucleu" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_NAME, @@ -3035,7 +3251,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, - "Restolador" + "Restolador de ficheros" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER_UP, @@ -3055,7 +3271,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_CORE_INFO, - "Información del nucleu" + "Información de los nucleos" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_CORE_SELECTION_ASK, @@ -3071,7 +3287,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_RESTART_TO_TAKE_EFFECT, - "Reanicia'l programa pa que los cambeos faigan efeutu, por favor." + "Reanicia'l programa pa que los cambeos faigan efeutu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_LOG, @@ -3127,7 +3343,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_SEARCH_CLEAR, - "Llimpiar" + "Borrar" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_PROGRESS, @@ -3267,7 +3483,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_DOWNLOAD_ALREADY_IN_PROGRESS, - "Xá hai una descarga en cursu." + "Yá hai una descarga en cursu." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_MENU_VIEW_OPTIONS_THUMBNAIL_TYPE, @@ -3328,6 +3544,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_USE_BUILTIN_IMAGE_VIEWER, "Usar el visor d'imáxenes integráu" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_BROWSE_START, + "Aniciar" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ROOM_NICKNAME, "Nomatu: %s" @@ -3365,7 +3585,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLEAR_SETTING, - "Llimpiar" + "Borrar" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, @@ -3376,35 +3596,35 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PUBLISHER, - "Base de datos - Peñera: Espublizador" + "Base de datos - Peñera: espublizador" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ORIGIN, - "Base de datos - Peñera: Orixe" + "Base de datos - Peñera: orixe" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_FRANCHISE, - "Base de datos - Peñera: Franquicia" + "Base de datos - Peñera: franquicia" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ESRB_RATING, - "Base de datos - Peñera: Valoración d'ESRB" + "Base de datos - Peñera: Clasificación d'ESRB" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_ELSPA_RATING, - "Base de datos - Peñera: Valoración d'ELSPA" + "Base de datos - Peñera: Clasificación d'ELSPA" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_PEGI_RATING, - "Base de datos - Peñera: Valoración de PEGI" + "Base de datos - Peñera: Clasificación de PEGI" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_CERO_RATING, - "Base de datos - Peñera: Valoración de CERO" + "Base de datos - Peñera: Clasificación de CERO" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_DATABASE_CURSOR_LIST_ENTRY_BBFC_RATING, - "Base de datos - Peñera: Valoración de BBFC" + "Base de datos - Peñera: Clasificación de BBFC" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONFIG, @@ -3446,7 +3666,7 @@ MSG_HASH( MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, - "El xuegu en llinia va aniciar cuando se cague conteníu." + "El xuegu en llinia aníciase cuando se carga conteníu." ) MSG_HASH( MSG_FAILED_TO_SAVE_DEBUG_INFO, @@ -3466,11 +3686,15 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_PLAYER_S_LEFT, - "%.*s coló de la partida" + "«%.*s» coló de la partida" ) MSG_HASH( MSG_NETPLAY_S_HAS_JOINED_AS_PLAYER_N, - "%.*s xunióse como xugador %u" + "«%.*s» xunióse como xugador %u" + ) +MSG_HASH( + MSG_NETPLAY_ENDIAN_DEPENDENT, + "Esti nucleu nun ye compatible col xuegu en llinia ente estes plataformes" ) MSG_HASH( MSG_NETPLAY_SERVER_NAMED_HANGUP, @@ -3519,7 +3743,7 @@ MSG_HASH( ) MSG_HASH( MSG_ALL_CORES_SWITCHED_PFD, - "Tolos nucleos sofitaos cambiaron a les versiones de la Play Store" + "Tolos nucleos compatibles cambiaron a les versiones de Play Store" ) MSG_HASH( MSG_ADDED_TO_FAVORITES, @@ -3539,7 +3763,7 @@ MSG_HASH( ) MSG_HASH( MSG_COULD_NOT_FIND_VALID_DATA_TRACK, - "Nun se pudo atopar nenguna pista de datos válida" + "Nun se pudo atopar la pista de datos válida" ) MSG_HASH( MSG_COULD_NOT_OPEN_DATA_TRACK, @@ -3633,6 +3857,10 @@ MSG_HASH( MSG_FAST_FORWARD, "Avance rápidu." ) +MSG_HASH( + MSG_NO_THUMBNAIL_AVAILABLE, + "Nun hai nenguna miniatura disponible" + ) MSG_HASH( MSG_PRESS_AGAIN_TO_QUIT, "Volvi primir pa colar…" @@ -3683,7 +3911,7 @@ MSG_HASH( ) MSG_HASH( MSG_LOAD_CORE_FIRST, - "Carga un nucleu primero, por favor." + "Carga un nucleu primero." ) MSG_HASH( MSG_DISC_DUMP_FAILED_TO_WRITE_TO_DISK, @@ -3727,6 +3955,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_RESTART_KEY, "Reaniciar Retroarch" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_REBOOT, + "Amosar la opción «Reaniciar»" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_MENU_SHOW_SHUTDOWN, + "Amosar la opción «Apagar»" + ) MSG_HASH( MSG_LOCAL, "Llocal" @@ -3774,7 +4010,7 @@ MSG_HASH( ) MSG_HASH( MSG_LOCALAP_ERROR_CONFIG_PARSE, - "El ficheru de configuración ye incorreutu - nun se pudo atopar APNAME o PASSWORD en %s" + "El ficheru de configuración ye incorreutu, nun se pudo atopar APNAME o PASSWORD en: %s" ) #endif #ifdef HAVE_LAKKA_SWITCH diff --git a/intl/msg_hash_be.h b/intl/msg_hash_be.h index 2ce6128b285..7ef27895f4d 100644 --- a/intl/msg_hash_be.h +++ b/intl/msg_hash_be.h @@ -85,7 +85,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_HELP_LOAD_CONTENT_LIST, - "Агледзець змесціва. Для загрузкі неабходны 'ядро' ды файл са змесцівам.\nЗадайце 'каталог аглядальніка файлаў', дзе меню пачне агляд змесціва. Калі не зададзена, будзе пачынацца з кораню.\nАглядальнік будзе фільтраваць пашырэнні згодна з апошнім ядром, выбраным праз 'Загрузі[...]" + "Агледзець змесціва. Для загрузкі неабходны 'ядро' ды файл са змесцівам.\nЗадайце 'каталог браўзера файлаў', дзе меню пачне агляд змесціва. Калі не зададзена, будзе пачынацца з кораню.\nБраўзер будзе фільтраваць пашырэнні згодна з апошнім ядром, выбраным праз 'Загрузіць ядро', [...]" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOAD_DISC, @@ -1111,7 +1111,7 @@ MSG_HASH( MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_UP, - "Прагортка ўгару" + "Прагортка ўгору" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_CONTROLS_SCROLL_DOWN, @@ -1278,11 +1278,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_FILE_BROWSER_SETTINGS, - "Файлавы аглядальнік" + "Файлавы браўзер" ) MSG_HASH( MENU_ENUM_SUBLABEL_MENU_FILE_BROWSER_SETTINGS, - "Змяніць налады файлавага аглядальніка." + "Змяніць налады файлавага браўзера." ) MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_CONFIG, @@ -3925,9 +3925,61 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_SAVESTATE_FILE_COMPRESSION, "Сцісканне захавання стану" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SORT_SCREENSHOTS_BY_CONTENT_ENABLE, + "Сартаванне здымкаў экрана па тэчкам каталога змесціва" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SORT_SCREENSHOTS_BY_CONTENT_ENABLE, + "Рассартоўваць здымкі экрана па тэчкам з назвай каталогаў, дзе размешчана змесціва." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Запіс захаванняў у каталог змесціва" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVEFILES_IN_CONTENT_DIR_ENABLE, + "Выкарыстоўваць каталог змесціва як каталог файлаў захавання." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Запіс захаванняў стану ў каталог змесціва" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SAVESTATES_IN_CONTENT_DIR_ENABLE, + "Выкарыстоўваць каталог змесціва як каталог захаванняў стану." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "Сістэмныя файлы ў каталозе змесціва" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SYSTEMFILES_IN_CONTENT_DIR_ENABLE, + "Выкарыстоўваць каталог змесціва як сістэмны/BIOS каталог." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Запіс здымкаў экрана ў каталог змесціва" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SCREENSHOTS_IN_CONTENT_DIR_ENABLE, + "Выкарыстоўваць каталог змесціва як каталог здымкаў экрана." + ) /* Settings > Logging */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY, + "Вядзенне журнала" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_VERBOSITY, + "Заносіць падзеі ў тэрмінал або файл." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LIBRETRO_LOG_LEVEL, + "Узровень журналявання ядра" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY_DEBUG, "0 (Адладка)" @@ -3944,12 +3996,64 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_LOG_VERBOSITY_ERROR, "3 (Памылкі)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE, + "Журналяванне ў файл" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE, + "Перанакіроўваць паведамленні журнала сістэмных падзей у файл. Патрабуе, каб было ўключана 'Вядзенне журнала'." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_LOG_TO_FILE_TIMESTAMP, + "Файлы журналаў з адбіткамі часу" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_LOG_TO_FILE_TIMESTAMP, + "Пры журналяванні ў файл перанакіроўвае вывад з кожнага сеанса RetroArch у новы файл з адбіткам часу. Калі адключана, журнал будзе перазапісвацца пры кожным перазапуску RetroArch." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_PERFCNT_ENABLE, + "Лічыльнікі прадукцыйнасці" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_PERFCNT_ENABLE, + "Лічыльнікі прадукцыйнасці для RetroArch ды ядраў. Звесткі лічыльнікаў могуць дапамагчы вызначыць вузкія месцы сістэмы ды файна наладзіць прадукцыйнасць." + ) /* Settings > File Browser */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_SHOW_HIDDEN_FILES, + "Паказ схаваных файлаў ды каталогаў" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_SHOW_HIDDEN_FILES, + "Паказваць схаваныя файлы ды каталогі ў файлавым браўзеры." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, - "Фільтраваць невядомыя пашырэнні" + "Фільтраванне невядомых пашырэнняў" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_NAVIGATION_BROWSER_FILTER_SUPPORTED_EXTENSIONS_ENABLE, + "Фільтраваць файлы, якія паказваюцца файлавым браўзерам, па пашырэннях, якія падтрымліваюцца." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USE_BUILTIN_PLAYER, + "Выкарыстанне ўбудаванага медыяпрайгравальніка" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FILTER_BY_CURRENT_CORE, + "Фільтраванне па бягучаму ядру" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_USE_LAST_START_DIRECTORY, + "Памятаць апошні выкарыстаны пачатковы каталог" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_USE_LAST_START_DIRECTORY, + "Адкрываць файлавы браўзер на апошнім выкарыстаным месцы пры загрузцы змесціва з пачатковага каталога. Заўвага: месца будзе скінута да прадвызначанага пры перазапуску RetroArch." ) /* Settings > Frame Throttle */ @@ -3958,6 +4062,14 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_REWIND_SETTINGS, "Перамотка назад" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_META_REWIND, + "Змяніць налады перамоткі назад." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRAME_TIME_COUNTER_SETTINGS, + "Лічыльнік часу кадра" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SLOWMOTION_RATIO, "Паказчык запаволенага руху" @@ -4833,11 +4945,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_FILE_BROWSER, - "Паказ 'Файлавы аглядальнік'" + "Паказ 'Файлавы браўзер'" ) MSG_HASH( MENU_ENUM_SUBLABEL_SETTINGS_SHOW_FILE_BROWSER, - "Паказваць налады 'Файлавы аглядальнік'." + "Паказваць налады 'Файлавы браўзер'." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SETTINGS_SHOW_FRAME_THROTTLE, @@ -5463,7 +5575,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_RUNTIME, - "Час выканання:" + "Часу за гульнёй:" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_PLAYLIST_SUBLABEL_LAST_PLAYED, @@ -5650,11 +5762,11 @@ MSG_HASH( ) MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_LABEL_VALUE_RGUI_BROWSER_DIRECTORY, - "Файлавы аглядальнік" + "Файлавы браўзер" ) MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_SUBLABEL_RGUI_BROWSER_DIRECTORY, - "Задаць пачатковы каталог для файлавага аглядальніка." + "Задаць пачатковы каталог для файлавага браўзера." ) MSG_HASH( /* FIXME Not RGUI specific */ MENU_ENUM_LABEL_VALUE_RGUI_CONFIG_DIRECTORY, @@ -7735,7 +7847,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_TAB_FILE_BROWSER, - "Файлавы аглядальнік" + "Файлавы браўзер" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_QT_THUMBNAIL_SCREENSHOT, @@ -8048,6 +8160,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_PORT_DEVICE_NAME, "Порт %d назва прылады: %s (#%d)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_RUN_MUSIC, + "Прайграць з дапамогай медыяпрайгравальніка" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SECONDS, "секунд" @@ -8196,7 +8312,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_SCROLL_UP, - "Прагортка ўгару" + "Прагортка ўгору" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_BASIC_MENU_ENUM_CONTROLS_TOGGLE_KEYBOARD, @@ -8287,7 +8403,7 @@ MSG_HASH( ) MSG_HASH( MSG_FETCHING_CORE_LIST, - "Набыванне спіса ядраў..." + "Атрыманне спіса ядраў..." ) MSG_HASH( MSG_CORE_LIST_FAILED, diff --git a/intl/msg_hash_ca.h b/intl/msg_hash_ca.h index ea02994dec5..052bf325360 100644 --- a/intl/msg_hash_ca.h +++ b/intl/msg_hash_ca.h @@ -1903,18 +1903,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Relació d'aspecte personalitzat (posició X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Òfset de subàrea de visualització personalitzat per definir la posició de l'eix X de la subàrea de visualització.\nS'ignora si s'activa 'Escalat d'enter'." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Relació d'aspecte personalitzat (posició Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Òfset de subàrea de visualització personalitzat per definir la posició de l'eix Y de la subàrea de visualització.\nS'ignora si s'activa 'Escalat d'enter'." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_chs.h b/intl/msg_hash_chs.h index 3bbd331d8d9..c447493895f 100644 --- a/intl/msg_hash_chs.h +++ b/intl/msg_hash_chs.h @@ -2551,18 +2551,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "自定义宽高比 X 位置" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "自定义 X 轴视图偏移量。\n如果启用「整数缩放」则忽略此选项。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "自定义宽高比 Y 位置" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "自定义 Y 轴视图偏移量。\n如果启用「整数缩放」则忽略此选项。" - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_cht.h b/intl/msg_hash_cht.h index e7fd81052a1..6888160211c 100644 --- a/intl/msg_hash_cht.h +++ b/intl/msg_hash_cht.h @@ -2343,18 +2343,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "自訂水平位置" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "自訂影像顯示水平位置, 正數向右移動, 負數向左移動。\n開啟「整數縮放」時此選項被忽略。" - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "自訂垂直位置" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "自訂影像顯示垂直位置, 正數向下移動, 負數向上移動。\n開啟「整數縮放」時此選項被忽略。" - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_cs.h b/intl/msg_hash_cs.h index dade613cd53..24c7d54aeba 100644 --- a/intl/msg_hash_cs.h +++ b/intl/msg_hash_cs.h @@ -2495,18 +2495,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Vlastní poměr stran (poloha X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Vlastní posun zobrazení, který se používá k určení polohy zobrazení v ose X.\nTyto údaje jsou ignorovány, pokud je povoleno 'Celočíselné Škálování'." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Vlastní poměr stran (poloha Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Vlastní posun zobrazení, který se používá k určení polohy osy Y zobrazení.\nTyto údaje jsou ignorovány, pokud je povoleno 'Celočíselné Škálování'." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_de.h b/intl/msg_hash_de.h index 04c4d1ca338..8d1eb0a4c59 100644 --- a/intl/msg_hash_de.h +++ b/intl/msg_hash_de.h @@ -2473,7 +2473,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Benutzerdefinierter Versatz des Ansichtsfensters, welcher die X-Achsenposition definiert.\nDieser wird ignoriert, wenn \"Ganzzahlige Skalierung\" aktiviert ist." + "Benutzerdefinierter Viewport-Offset zur Definition der X-Achsenposition des Viewports." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2481,24 +2481,56 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Benutzerdefinierter Versatz des Ansichtsfensters, welcher die Y-Achsenposition definiert.\nDieser wird ignoriert, wenn \"Ganzzahlige Skalierung\" aktiviert ist." + "Angepasster Viewport-Offset zur Definition der Y-Achsenposition des Viewports." + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Ansichtsfenster-Ankerpunkt-Ausrichtung X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Ansichtsfenster-Ankerpunkt-Ausrichtung X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Ansichtsfenster-Ankerpunkt-Ausrichtung Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Ansichtsfenster-Ankerpunkt-Ausrichtung Y" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, - "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster horizontal zu versetzen (wenn es breiter als die Inhaltshöhe ist). 0.0 bedeutet ganz links und 1.0 bedeutet ganz rechts." + "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster horizontal zu versetzen (wenn es breiter als die Inhaltshöhe ist). 0.0 bedeutet ganz links und 1.0 bedeutet ganz rechts." ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, - "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster vertikal zu versetzen (wenn es höher als die Inhaltshöhe ist). 0.0 bedeutet oben und 1.0 bedeutet unten." + "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster vertikal zu versetzen (wenn es höher als die Inhaltshöhe ist). 0.0 bedeutet oben und 1.0 bedeutet unten." ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Ansichtsfenster-Ankerpunkt-Ausrichtung X (Hochformat)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Ansichtsfenster-Ankerpunkt-Ausrichtung X (Hochformat)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Ansichtsfenster-Ankerpunkt-Ausrichtung Y (Hochformat)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Ansichtsfenster-Ankerpunkt-Ausrichtung Y (Hochformat)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, - "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster horizontal zu versetzen (wenn es breiter als die Inhaltshöhe ist). 0.0 bedeutet ganz links und 1.0 bedeutet ganz rechts. (Hochformat)" + "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster horizontal zu versetzen (wenn es breiter als die Inhaltshöhe ist). 0.0 bedeutet ganz links und 1.0 bedeutet ganz rechts. (Hochformat)" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, - "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster vertikal zu versetzen (wenn es höher als die Inhaltshöhe ist). 0.0 bedeutet oben und 1.0 bedeutet unten. (Hochformat)" + "Benutzerdefinierte Ausrichtung des Ansichtsfensters wird verwendet, um das Ansichtsfenster vertikal zu versetzen (wenn es höher als die Inhaltshöhe ist). 0.0 bedeutet oben und 1.0 bedeutet unten. (Hochformat)" ) #endif MSG_HASH( @@ -13917,6 +13949,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "%s für %s eingereicht" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Rang: %d" /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "Beste(r): %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Vorschaubildart ändern" diff --git a/intl/msg_hash_en.h b/intl/msg_hash_en.h index 5162b1421f1..d2c8c779da2 100644 --- a/intl/msg_hash_en.h +++ b/intl/msg_hash_en.h @@ -182,6 +182,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_SUSPEND_SCREENSAVER_ENABLE, "Suspends the screensaver. Is a hint that does not necessarily have to be honoured by the video driver." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, + "Inserts black frame(s) in between frames for enhanced motion clarity. Only use option designated for your current display refresh rate. Not for use at refresh rates that are non-multiples of 60Hz such as 144Hz, 165Hz, etc. Do not combine with Swap Interval > 1, sub-frames, Frame Delay, or Sync to Exact Content Framerate. Leaving system VRR on is ok, just not that setting. If you notice -any- temporary image retention, you should disable at 120Hz, and for higher Hz adjust the dark frames setting [...]" + ) MSG_HASH( MENU_ENUM_LABEL_HELP_VIDEO_BFI_DARK_FRAMES, "Adjusts the number of frames displayed in the BFI sequence that are black. More black frames increases motion clarity but reduces brightness. Not applicable at 120hz as there is only one total extra 60hz frame, so it must be black otherwise BFI would not be active at all." @@ -249,6 +253,10 @@ MSG_HASH( /* Settings > Video > Output */ #if defined (WIIU) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_WIIU_PREFER_DRC, + "Optimise for Wii U GamePad (Restart required)" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_AUTOSWITCH_REFRESH_RATE_EXCLUSIVE_FULLSCREEN, @@ -489,6 +497,10 @@ MSG_HASH( /* Settings > Input */ +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_POLL_TYPE_BEHAVIOR, + "Polling Behaviour (Restart required)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, "Remap the Controls for This Core" @@ -667,10 +679,18 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_INPUT_ADC_TYPE, "Map specified analogue stick for D-Pad input.\nIf core has native analogue support, D-Pad mapping will be disabled unless a '(Forced)' option is selected.\nIf D-Pad mapping is forced, core will receive no analogue input from specified stick." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_INDEX, + "The physical controller as recognised by RetroArch." + ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_REMAP_PORT, "Specifies which core port will receive input from front-end controller port %u." ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_MOUSE_INDEX, + "The physical mouse as recognised by RetroArch." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_ANALOG_LEFT_X_PLUS, "Left Analogue X+ (Right)" @@ -842,6 +862,18 @@ MSG_HASH( /* Settings > On-Screen Display > On-Screen Overlay > Overlay Lightgun */ +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_TWO_TOUCH_INPUT, + "Select input to send when two pointers are on screen. Trigger Delay should be non-zero to distinguish from other input." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_THREE_TOUCH_INPUT, + "Select input to send when three pointers are on screen. Trigger Delay should be non-zero to distinguish from other input." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_OVERLAY_LIGHTGUN_FOUR_TOUCH_INPUT, + "Select input to send when four pointers are on screen. Trigger Delay should be non-zero to distinguish from other input." + ) /* Settings > On-Screen Display > On-Screen Overlay > Overlay Mouse */ @@ -997,6 +1029,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_FAVORITES, "Show 'Favourites'" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CONTENT_SHOW_FAVORITES, + "Show the 'Favourites' menu. (Restart required on Ozone/XMB)" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, "Show 'Net-play'" @@ -2129,6 +2165,10 @@ MSG_HASH( MSG_INPUT_KIOSK_MODE_PASSWORD_NOK, "Password is incorrect." ) +MSG_HASH( + MSG_CHEAT_SEARCH_NOT_INITIALIZED, + "Searching has not been initialised/started." + ) MSG_HASH( MSG_CHEAT_SEARCH_ADDED_MATCHES_TOO_MANY, "There's not enough room. The maximum number of simultaneous cheats is 100." diff --git a/intl/msg_hash_es.h b/intl/msg_hash_es.h index de045a18684..f47442774db 100644 --- a/intl/msg_hash_es.h +++ b/intl/msg_hash_es.h @@ -2547,18 +2547,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Relación de aspecto personalizada (posición X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Indica el diferencial de posición respecto al eje X del área de visualización.\nEste valor se ignorará si la opción «Escalar usando números enteros» está activada." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Relación de aspecto personalizada (posición Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Indica el diferencial de posición respecto al eje Y del área de visualización.\nEste valor se ignorará si la opción «Escalar usando números enteros» está activada." - ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, "Compensación del eje X del punto de anclaje del área de visualización" diff --git a/intl/msg_hash_fi.h b/intl/msg_hash_fi.h index f38b740cc89..0e9ff845381 100644 --- a/intl/msg_hash_fi.h +++ b/intl/msg_hash_fi.h @@ -2331,18 +2331,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Mukautettu kuvasuhde (X-sijainti)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Mukautettu ikkunan siirtymä, jota käytetään ikkunan X-akselin sijainnin määrittämiseen.\nNämä jätetään huomioimatta, jos 'Skaalaa kokonaisluvuin' on käytössä." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Mukautettu kuvasuhde (Y-sijainti)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Mukautettu ikkunan siirtymä, jota käytetään ikkunan Y-akselin sijainnin määrittämiseen.\nNämä jätetään huomioimatta, jos 'Skaalaa kokonaisluvuin' on käytössä." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_fr.h b/intl/msg_hash_fr.h index 1e4357fbce8..4ceae4fa07f 100644 --- a/intl/msg_hash_fr.h +++ b/intl/msg_hash_fr.h @@ -2529,7 +2529,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Décalage de la fenêtre d'affichage sur l'axe X.\nCette option sera ignorée si l'option 'Échelle à l'entier' est activée." + "Décalage de la fenêtre d'affichage personnalisé utilisé pour définir la position sur l'axe X de la fenêtre d'affichage." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2537,7 +2537,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Décalage de la fenêtre d'affichage sur l'axe Y.\nCette option sera ignorée si l'option 'Échelle à l'entier' est activée." + "Décalage de la fenêtre d'affichage personnalisé utilisé pour définir la position sur l'axe Y de la fenêtre d'affichage." ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, @@ -14233,6 +14233,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "Soumis %s pour %s" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Classement : %d" /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "Meilleur : %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Changer le type de miniatures" diff --git a/intl/msg_hash_gl.h b/intl/msg_hash_gl.h index 6563779ca9e..c5b35c2ba95 100644 --- a/intl/msg_hash_gl.h +++ b/intl/msg_hash_gl.h @@ -1220,10 +1220,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, "Sincronización da nube destrutiva" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "Sincronización: Gardados/Estados" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, - "Sync: Configuration Files" + "Sincronización: Ficheiros de Configuración" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "Cando está activado, os gardados/estados sincronizaranse coa nube." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "Cando está habilitado, os ficheiros de configuración sincronizaranse coa nube." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, "Cando está desactivado, os ficheiros móvense a un cartafol de copia de seguranza antes de sobrescribilos ou eliminalos." @@ -1356,6 +1368,10 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_FILE_BROWSER_DIRECTORY, "Directorio. Selecciónao para abrir este directorio." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_FRAME_THROTTLE_SETTINGS, + "Aceleración de Fotogramas" + ) MSG_HASH( MENU_ENUM_SUBLABEL_FRAME_THROTTLE_SETTINGS, "Cambiar os axustes de retroceso, avance rápido e cámara lenta." @@ -2511,17 +2527,25 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Relación de aspecto personalizada (posición X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Desprazamento da ventana gráfica personalizada que se usa para definir a posición do eixe X da ventana gráfica.\nIgnoraranse se se activa a \"Escala enteira\"." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Relación de aspecto personalizada (posición Y)" ) MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Desfase personalizado da ventana gráfica que se usa para definir a posición do eixe Y da ventana gráfica.\nIgnoraranse se está activada a \"Escala enteira\"." + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Axuste de Ancoraxe da Xanela gráfica en X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Axuste de Ancoraxe da Xanela gráfica en X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Axuste de Ancoraxe da Xanela gráfica en Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Axuste de Ancoraxe da Xanela gráfica en Y" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, @@ -2532,6 +2556,22 @@ MSG_HASH( "Desviación personalizada do porto de vista usada para compensar o porto de vista verticalmente (se for máis alto que a altura do contido). 0.0 significa arriba e 1.0 significa abaixo." ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Desprazamento da ancoraxe da Xanela Gráfica en X (orientación vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Desprazamento da ancoraxe da Xanela Gráfica en X (orientación vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Desprazamento da ancoraxe da Xanela Gráfica en Y (orientación vertical)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Desprazamento da ancoraxe da Xanela Gráfica en Y (orientación vertical)" + ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, "Desviación personalizada do porto de vista usada para desprazar o porto de vista horizontalmente (se for máis ancho que a altura do contido). 0.0 significa á esquerda e 1.0 significa á dereita. (Orientación en retrato)" @@ -2685,7 +2725,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VRR_RUNLOOP_ENABLE, - "Sincronización coa taxa de fotogramas do contido exacto (G-Sync, FreeSync)" + "Sincronizar taxa de fotogramas ao contido exacto (G-Sync, FreeSync)" ) MSG_HASH( MENU_ENUM_SUBLABEL_VRR_RUNLOOP_ENABLE, @@ -3179,7 +3219,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_HELP_INPUT_POLL_TYPE_BEHAVIOR, - "Inflúe na forma en que se realiza a votación de entrada dentro de RetroArch.\nA principios: a enquisa de entrada realízase antes de que se procese o fotograma.\nNormal: a enquisa de entrada realízase cando se solicita o sondeo.\nTarde: a votación de entrada realízase na primeira solicitude de estado de entrada por fotograma.\\ nSeleccionándoo como \"cedo\" ou \"Tardía\" pode producir menos latencia, dependendo da túa configuración. Ignorarase ao usar netplay." + "Inflúe na forma en que se realiza a votación de entrada dentro de RetroArch.\nA principios: a enquisa de entrada realízase antes de que se procese o fotograma.\nNormal: a enquisa de entrada realízase cando se solicita o sondeo.\nTarde: a votación de entrada realízase na primeira solicitude de estado de entrada por fotograma.\\ nSeleccionándoo como \"cedo\" ou \"Tardía\" pode producir menos latencia, dependendo da túa configuración. Ignorarase ao usar xogo en rede." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_BINDS_ENABLE, @@ -3973,7 +4013,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_HOST_TOGGLE, - "Activa/desactiva o hospedaxe de Xogo en Rede." + "Activa/desactiva a hospedaxe de Xogo en Rede." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_GAME_WATCH, @@ -3993,7 +4033,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_META_NETPLAY_FADE_CHAT_TOGGLE, - "Activar/desactivar Netplay Fade Chat" + "Activar/desactivar atenuado do chat no Xogo en rede" ) MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_META_NETPLAY_FADE_CHAT_TOGGLE, @@ -5593,11 +5633,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_PING_SHOW, - "Mostrar ping de Netplay" + "Amosar ping de Xogo en Rede" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_PING_SHOW, - "Mostra o ping para a sala de netplay actual." + "Amosa o ping para a sala do Xogo en Rede actual." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_SHOW_LOAD_CONTENT_ANIMATION, @@ -5729,7 +5769,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NOTIFICATION_SHOW_NETPLAY_EXTRA, - "Mostra mensaxes en pantalla de netplay non esenciais." + "Amosa mensaxes en pantalla do Xogo en rede non esenciais." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NOTIFICATION_SHOW_WHEN_MENU_IS_ALIVE, @@ -6197,9 +6237,13 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_VIDEO, "Mostrar \"Vídeos\"" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_NETPLAY, + "Amosar 'Xogo en Rede'" + ) MSG_HASH( MENU_ENUM_SUBLABEL_CONTENT_SHOW_NETPLAY, - "Mostra o menú \"Netplay\". (Requírese reiniciar en Ozone/XMB)" + "Amosa o menú \"Xogo en rede\". (Requírese reiniciar en Ozone/XMB)" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CONTENT_SHOW_HISTORY, @@ -7313,15 +7357,15 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_CHECK_FRAMES, - "Netplay comproba Fotogramas" + "Xogo en Rede comproba Fotogramas" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_CHECK_FRAMES, - "A frecuencia (en fotogramas) que netplay verificará que o host e o cliente están sincronizados." + "A frecuencia (en fotogramas) co xogo en rede verificará que o anfitrión e o cliente están sincronizados." ) MSG_HASH( MENU_ENUM_LABEL_HELP_NETPLAY_CHECK_FRAMES, - "A frecuencia en fotogramas coa que netplay verificará que o host e o cliente están sincronizados. Na maioría dos núcleos, este valor non terá ningún efecto visible e pódese ignorar. Con núcleos non determinstic, este valor determina a frecuencia con que se sincronizarán os pares de netplay. Con núcleos con erros, establecer este valor en calquera valor distinto de cero causará graves problemas de rendemento. Establécese a cero para non realizar comprobacións. Este valor só se usa n[...]" + "A frecuencia en fotogramas coa que o xogo en rede verificará co anfitrión e o cliente están sincronizados. Na maioría dos núcleos, este valor non terá ningún efecto visible e pódese ignorar. Con núcleos non deterministas, este valor determina a frecuencia con que se sincronizarán os pares de xogo en rede. Con núcleos con erros, establecer este valor en calquera valor distinto de cero causará graves problemas de rendemento. Establécese a cero para non realizar comprobacións. Este va[...]" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_INPUT_LATENCY_FRAMES_MIN, @@ -7345,7 +7389,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_HELP_NETPLAY_INPUT_LATENCY_FRAMES_RANGE, - "O intervalo de fotogramas de latencia de entrada que pode usar netplay para ocultar a latencia da rede.\nSe se establece, netplay axustará o número de fotogramas de latencia de entrada de forma dinámica para equilibrar o tempo da CPU, a latencia de entrada e a latencia da rede. Isto reduce o nerviosismo e fai que o xogo en rede sexa menos intensivo en CPU, pero ao prezo dun retardo de entrada imprevisible." + "O intervalo de fotogramas de latencia de entrada que pode usar xogo en rede para ocultar a latencia da rede.\nSe se establece, xogo en rede axustará o número de fotogramas de latencia de entrada de forma dinámica para equilibrar o tempo da CPU, a latencia de entrada e a latencia da rede. Isto reduce o nerviosismo e fai que o xogo en rede sexa menos intensivo en CPU, pero ao prezo dun retardo de entrada imprevisible." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_NETPLAY_NAT_TRAVERSAL, + "Xogo en rede NAT Traversal" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_NAT_TRAVERSAL, @@ -7773,7 +7821,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_NICKNAME, - "Introduza aquí o seu nome de usuario. Usarase para sesións de netplay, entre outras cousas." + "Insira aquí o seu nome de usuario. Usarase para sesións de xogos en rede, entre outras cousas." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_USER_LANGUAGE, @@ -8213,19 +8261,19 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_CLIENT, - "Conéctate ao Netplay do Anfitrión" + "Conéctate ao Xogo en Rede do Anfitrión" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_CLIENT, - "Introduza o enderezo do servidor de netplay e conéctese no modo cliente." + "Introduza o enderezo do servidor do Xogo en Rede e conéctese no modo cliente." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_DISCONNECT, - "Desconectar de Netplay Host" + "Desconectar do Xogo en Rede Anfitrión" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_DISCONNECT, - "Desconecta unha conexión de netplay activa." + "Desconecta unha conexión de xogo en rede activa." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_LOBBY_FILTERS, @@ -8249,22 +8297,22 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_ROOMS, - "Actualizar a lista de hosts de Netplay." + "Actualizar a lista de servidores de Xogo en Rede." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_REFRESH_LAN, - "Actualizar a lista LAN de Netplay" + "Actualizar a lista LAN de Xogo en Rede" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_REFRESH_LAN, - "Busca hosts de netplay na LAN." + "Busca servidores de xogo en rede na LAN." ) /* Netplay > Host */ MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE_HOST, - "Inicia Netplay do Anfitrión" + "Comezar Servidor de Xogo en Rede" ) MSG_HASH( MENU_ENUM_SUBLABEL_NETPLAY_ENABLE_HOST, @@ -8272,7 +8320,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_DISABLE_HOST, - "Detén Netplay do Anfitrión" + "Detén o Xogo en rede do Anfitrión" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_KICK, @@ -12270,11 +12318,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_NETPLAY_HOSTS_FOUND, - "Non se atoparon Anfitrións de netplay." + "Non se atoparon Anfitrións de xogo en rede." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_NETPLAY_CLIENTS_FOUND, - "Non se atoparon clientes de netplay." + "Non se atoparon clientes de xogo en rede." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NO_PERFORMANCE_COUNTERS, @@ -12517,7 +12565,7 @@ MSG_HASH( /* FIXME Still exists in a comment about being removed */ ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_ENABLE, - "Xogo en liña" + "Xogo en rede" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RDB_ENTRY_START_CONTENT, @@ -12577,7 +12625,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_DELAY_FRAMES, - "Marcos de retardo de Netplay" + "Marcos de retardo de Xogo en Rede" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_LAN_SCAN_SETTINGS, @@ -12589,11 +12637,11 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_MODE, - "Cliente Netplay" + "Cliente de Xogo en Rede" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_SPECTATOR_MODE_ENABLE, - "Espectador Netplay" + "Espectador de Xogo en Rede" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CHEEVOS_DESCRIPTION, @@ -12744,7 +12792,7 @@ MSG_HASH( /* FIXME Seems related to MENU_ENUM_LABEL_VALUE_CORE_ASSETS_DIRECTORY, ) MSG_HASH( MENU_ENUM_LABEL_VALUE_NETPLAY_SETTINGS, - "Configuración de Netplay" + "Configuración de Xogo en Rede" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_SYSTEM_INFO_SLANG_SUPPORT, @@ -12826,11 +12874,11 @@ MSG_HASH( MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_START_WHEN_LOADED, - "Netplay comezará cando se cargue o contido." + "Xogo en Rede comezará cando se cargue o contido." ) MSG_HASH( MSG_NETPLAY_NEED_CONTENT_LOADED, - "O contido debe cargarse antes de iniciar a netplay." + "O contido debe cargarse antes de iniciar o xogo en rede." ) MSG_HASH( /* FIXME Should be MSG_ */ MENU_ENUM_LABEL_VALUE_NETPLAY_LOAD_CONTENT_MANUALLY, @@ -12882,11 +12930,11 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_LAN_SCAN_COMPLETE, - "Escaneo de Netplay completo." + "Escaneo de Xogo en rede completo." ) MSG_HASH( MSG_SORRY_UNIMPLEMENTED_CORES_DONT_DEMAND_CONTENT_NETPLAY, - "Sentímolo, sen implementar: os núcleos que non esixen contido non poden participar na rede." + "Sentímolo, sen implementar: os núcleos que non esixen contido non poden participar no xogo en rede." ) MSG_HASH( MSG_NATIVE, @@ -12894,7 +12942,7 @@ MSG_HASH( ) MSG_HASH( MSG_UNKNOWN_NETPLAY_COMMAND_RECEIVED, - "Recibiuse un comando netplay descoñecido" + "Recibiuse un comando de Xogo en Rede descoñecido" ) MSG_HASH( MSG_FILE_ALREADY_EXISTS_SAVING_TO_BACKUP_BUFFER, @@ -12910,7 +12958,7 @@ MSG_HASH( ) MSG_HASH( MSG_PUBLIC_ADDRESS, - "A asignación de portos de Netplay foi exitosa" + "A asignación de portos de Xogo en Rede foi exitosa" ) MSG_HASH( MSG_PRIVATE_OR_SHARED_ADDRESS, @@ -12918,7 +12966,7 @@ MSG_HASH( ) MSG_HASH( MSG_UPNP_FAILED, - "Fallou a asignación de portos UPnP de Netplay" + "Fallou a asignación de portos UPnP de Xogo en Rede" ) MSG_HASH( MSG_NO_ARGUMENTS_SUPPLIED_AND_NO_MENU_BUILTIN, @@ -12962,27 +13010,27 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_NOT_RETROARCH, - "Produciuse un erro nun intento de conexión na rede porque o compañeiro non está a executar RetroArch ou está a executar unha versión antiga de RetroArch." + "Produciuse un erro nun intento de conexión ao xogo en rede porque o compañeiro non está a executar RetroArch ou está a executar unha versión antiga de RetroArch." ) MSG_HASH( MSG_NETPLAY_OUT_OF_DATE, - "Un peer de netplay está a executar unha versión antiga de RetroArch. Non se pode conectar." + "Un par de xogo en rede está a executar unha versión antiga de RetroArch. Non se pode conectar." ) MSG_HASH( MSG_NETPLAY_DIFFERENT_VERSIONS, - "AVISO: un peer de netplay está executando unha versión diferente de RetroArch. Se ocorren problemas, use a mesma versión." + "AVISO: un par de xogo en rede está executando unha versión diferente de RetroArch. Se ocorren problemas, use a mesma versión." ) MSG_HASH( MSG_NETPLAY_DIFFERENT_CORES, - "Un peer de netplay está executando un núcleo diferente. Non se pode conectar." + "Un par de xogo en rede está executando un núcleo diferente. Non se pode conectar." ) MSG_HASH( MSG_NETPLAY_DIFFERENT_CORE_VERSIONS, - "AVISO: un peer de netplay está executando unha versión diferente do núcleo. Se ocorren problemas, use a mesma versión." + "AVISO: un par de xogo en rede está executando unha versión diferente do núcleo. Se ocorren problemas, use a mesma versión." ) MSG_HASH( MSG_NETPLAY_ENDIAN_DEPENDENT, - "Este núcleo non admite a rede entre estas plataformas" + "Este núcleo non admite xogo en rede entre estas plataformas" ) MSG_HASH( MSG_NETPLAY_PLATFORM_DEPENDENT, @@ -12990,11 +13038,11 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_ENTER_PASSWORD, - "Introduce o contrasinal do servidor de netplay:" + "Introduce o contrasinal do servidor do xogo en rede:" ) MSG_HASH( MSG_NETPLAY_ENTER_CHAT, - "Introduce a mensaxe de chat de netplay:" + "Introduce a mensaxe de chat do xogo en rede:" ) MSG_HASH( MSG_DISCORD_CONNECTION_REQUEST, @@ -13010,11 +13058,11 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_SERVER_HANGUP, - "Un cliente de netplay desconectouse" + "Un cliente do xogo en rede desconectouse" ) MSG_HASH( MSG_NETPLAY_CLIENT_HANGUP, - "Netplay desconectado" + "Xogo en Rede desconectado" ) MSG_HASH( MSG_NETPLAY_CANNOT_PLAY_UNPRIVILEGED, @@ -13034,7 +13082,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_PEER_PAUSED, - "O par de Netplay \"%s\" detívose" + "O par de Xogo en Rede \"%s\" detívose" ) MSG_HASH( MSG_NETPLAY_CHANGED_NICK, @@ -13095,7 +13143,7 @@ MSG_HASH( ) MSG_HASH( MSG_CONNECTING_TO_NETPLAY_HOST, - "Conectando ao host de netplay" + "Conectando ao anfitrión do xogo en rede" ) MSG_HASH( MSG_CONNECTING_TO_PORT, @@ -13823,7 +13871,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_UNSUPPORTED, - "Núcleo non admite a reprodución en rede." + "Núcleo non admite o xogo en rede." ) MSG_HASH( MSG_NO_CONTENT_STARTING_DUMMY_CORE, @@ -14065,6 +14113,10 @@ MSG_HASH( MSG_ACHIEVEMENT_UNLOCKED, "Logro desbloqueado" ) +MSG_HASH( + MSG_RARE_ACHIEVEMENT_UNLOCKED, + "Desbloqueouse un logro raro" + ) MSG_HASH( MSG_LEADERBOARD_STARTED, "Comezou o intento de clasificación" @@ -14231,7 +14283,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_LAN_SCANNING, - "Buscando hosts de netplay..." + "Buscando anfitrións de xogo en rede..." ) MSG_HASH( MSG_PREPARING_FOR_CONTENT_SCAN, @@ -14439,7 +14491,7 @@ MSG_HASH( ) MSG_HASH( MSG_NETPLAY_HOST_FULL, - "Netplay host cheo." + "Xogo en rede anfitrión cheo." ) MSG_HASH( MSG_NETPLAY_BANNED, diff --git a/intl/msg_hash_hu.h b/intl/msg_hash_hu.h index 209043da22a..533cfe25dea 100644 --- a/intl/msg_hash_hu.h +++ b/intl/msg_hash_hu.h @@ -1204,10 +1204,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, "Destruktív szinkronizálás a felhőbe" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "Szinkronizálás: mentések és játékállapotok" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, - "Sync: Configuration Files" + "Szinkronizálás: konfigurációs fájlok" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "Bekapcsolva a mentések és játékállapotok szinkronizálódnak a felhőbe." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "Bekapcsolva a konfigurációs fájlok szinkronizálódnak a felhőbe." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, "Kikapcsolt állapotban a fájlok egy tartalék könyvtárba kerülnek felülírás vagy törlés előtt." @@ -2525,7 +2537,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Az egyedi nézőablak X irányú eltolása. \nNincs hatása egész-szorzós skálázáskor." + "Az egyedi nézőablak X irányú eltolása." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2533,9 +2545,57 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Az egyedi nézőablak Y irányú eltolása. \nNincs hatása egész-szorzós skálázáskor." + "Az egyedi nézőablak Y irányú eltolása." + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Nézőablak vízszintes eltolása" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Nézőablak vízszintes eltolása" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Nézőablak függőleges eltolása" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Nézőablak függőleges eltolása" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, + "Az egyedi nézőablak vízszintes középrehelyezése, ha a nézőablak szélesebb, mint a tartalom. 0.0 esetén teljesen balra, 1.0 esetén teljesen jobbra igazodik." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, + "Az egyedi nézőablak függőleges középrehelyezése, ha a nézőablak magasabb, mint a tartalom. 0.0 esetén teljesen fentre, 1.0 esetén teljesen lentre igazodik." ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Nézőablak vízszintes eltolása (álló nézetben)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Nézőablak vízszintes eltolása (álló nézetben)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Nézőablak függőleges eltolása (álló nézetben)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Nézőablak függőleges eltolása (álló nézetben)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Az egyedi nézőablak vízszintes középrehelyezése, ha a nézőablak szélesebb, mint a tartalom. 0.0 esetén teljesen balra, 1.0 esetén teljesen jobbra igazodik. (Álló nézet esetén.)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Az egyedi nézőablak függőleges középrehelyezése, ha a nézőablak magasabb, mint a tartalom. 0.0 esetén teljesen fentre, 1.0 esetén teljesen lentre igazodik. (Álló nézet esetén.)" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, @@ -13977,6 +14037,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "%s beküldve ehhez: %s" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Rang: %d." /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "Legjobb: %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Előnézet megváltoztatása" diff --git a/intl/msg_hash_id.h b/intl/msg_hash_id.h index 6711f2f0471..feaff4d53b9 100644 --- a/intl/msg_hash_id.h +++ b/intl/msg_hash_id.h @@ -1835,18 +1835,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Rasio Aspek Kustom (Posisi X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Offset area pandang khusus yang digunakan untuk menentukan posisi sumbu X dari area pandang.\n Ini diabaikan jika 'Skala Bilangan Bulat' diaktifkan." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Rasio Aspek Kustom (Posisi Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Offset area pandang khusus yang digunakan untuk menentukan posisi sumbu Y dari area pandang.\n Ini diabaikan jika 'Skala Bilangan Bulat' diaktifkan." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_it.h b/intl/msg_hash_it.h index 94544113d55..a97745d0b09 100644 --- a/intl/msg_hash_it.h +++ b/intl/msg_hash_it.h @@ -1188,10 +1188,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, "Sincronizzazione Cloud Distruttiva" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "Sincronizzazione: Salva/Stati" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, - "Sync: Configuration Files" + "Sincronizza: File Di Configurazione" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "Se abilitata, i salvataggi/stati verranno sincronizzati su cloud." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "Se abilitata, i file di configurazione verranno sincronizzati su cloud." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, "Quando disabilitato, i file vengono spostati in una cartella di backup prima di essere sovrascritti o cancellati." @@ -2491,19 +2503,59 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Personalizza Rapporto d'aspetto (in una posizione X.)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Scostamento visuale personalizzato usato per definire la posizione dell'asse X della porta di visualizzazione.\nQuesti vengono ignorati se 'Scala intera' è abilitata." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Rapporto d'aspetto personalizzato (posizione Y)" ) MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Scostamento visuale personalizzato usato per definire la posizione dell'asse Y della porta di visualizzazione.\nQuesti vengono ignorati se 'Scala intera' è abilitata." + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Bias Di Ancoraggio Di Viewport X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Bias Di Ancoraggio Di Viewport X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Bias Di Ancoraggio Di Viewport Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Bias Di Ancoraggio Di Viewport Y" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, + "Bias di visualizzazione personalizzata utilizzato per spostare la vista orizzontalmente (se più ampia dell'altezza del contenuto). 0.0 significa lontano a sinistra e 1.0 significa lontano a destra." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, + "Bias di visualizzazione personalizzata utilizzato per spostare la porta di visualizzazione verticalmente (se più alta dell'altezza del contenuto). 0.0 significa superiore e 1.0 significa basso." ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Bias Di Ancoraggio Di Viewport X (Orientamento Verticale)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Bias Di Ancoraggio Di Viewport X (Orientamento Verticale)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Bias Di Ancoraggio Di Viewport Y (Orientamento Verticale)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Bias Di Ancoraggio Di Viewport Y (Orientamento Verticale)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Bias di visualizzazione personalizzata utilizzato per spostare la vista orizzontalmente (se più ampia dell'altezza del contenuto). 0.0 significa lontano a sinistra e 1.0 significa lontano a destra. (Orientamento verticale)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Bias di visualizzazione personalizzata utilizzato per spostare la porta di visualizzazione verticalmente (se più alta dell'altezza del contenuto). 0.0 significa superiore e 1.0 significa inferiore. (Orientamento verticale)" + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, diff --git a/intl/msg_hash_ja.h b/intl/msg_hash_ja.h index 1b0e3bae596..e0ead5ac23b 100644 --- a/intl/msg_hash_ja.h +++ b/intl/msg_hash_ja.h @@ -2557,7 +2557,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "表示領域の X 軸位置を定義するために使用されるカスタム表示領域オフセットです。\n[整数倍拡大] が有効の場合は無視されます。" + "表示領域の X 軸位置を定義するために使用されるオフセット値です。" ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2565,7 +2565,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "表示領域の Y 軸位置を定義するために使用されるカスタム表示領域オフセットです。\n[整数倍拡大] が有効の場合は無視されます。" + "表示領域の Y 軸位置を定義するために使用されるオフセット値です。" ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, diff --git a/intl/msg_hash_ko.h b/intl/msg_hash_ko.h index df09db72353..70b86cb90f5 100644 --- a/intl/msg_hash_ko.h +++ b/intl/msg_hash_ko.h @@ -2551,18 +2551,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "사용자 화면비 X 위치" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "뷰포트의 X축 위치를 정의하는 데 사용되는 사용자 뷰포트 오프셋입니다.\n'정수 단위 화면 크기'가 활성화된 경우 무시되고 자동으로 중앙이 됩니다." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "사용자 화면비 Y 위치" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "뷰포트의 Y축 위치를 정의하는 데 사용되는 사용자 뷰포트 오프셋입니다.\n'정수 단위 화면 크기'가 활성화된 경우 무시되고 자동으로 중앙이 됩니다." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_nl.h b/intl/msg_hash_nl.h index a7d32445926..73bddcab15e 100644 --- a/intl/msg_hash_nl.h +++ b/intl/msg_hash_nl.h @@ -2071,18 +2071,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Aangepaste Beeldverhouding (X-positie)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Aangepaste weergave-offset gebruikt voor het definiëren van de X-as positie van de weergave.\nDeze worden genegeerd als 'Integer Schaal' is ingeschakeld." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Aangepaste Beeldverhouding (Y-positie)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Aangepaste weergave-offset gebruikt voor het definiëren van de Y-as positie van de weergave.\nDeze worden genegeerd als 'Integer Schaal' is ingeschakeld." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_no.h b/intl/msg_hash_no.h index 77ce98e30c8..c295f752327 100644 --- a/intl/msg_hash_no.h +++ b/intl/msg_hash_no.h @@ -1919,18 +1919,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Egendefinert størrelsesforhold (X posisjon)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Tilpasset visningsregion forskyvning bruk for å definere X-aksen av visningsregionen.\nDisse er ignorert hvis \"heltall skalering\" er aktivert." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Egendefinert størrelsesforhold (Y posisjon)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Tilpasset visningsregion forskyvning bruk for å definere Y-aksen av visningsregionen.\nDisse er ignorert hvis \"heltall skalering\" er aktivert." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_pl.h b/intl/msg_hash_pl.h index 61a8d0e823f..b509e4d7436 100644 --- a/intl/msg_hash_pl.h +++ b/intl/msg_hash_pl.h @@ -2507,18 +2507,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Niestandardowy współczynnik proporcji (pozycja X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Własne przesunięcie widoku używane do zdefiniowania pozycji osi X widoku.\nSą one ignorowane, jeśli 'Skala całkowita' jest włączona." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Niestandardowy współczynnik proporcji (pozycja Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Własne przesunięcie widoku używane do zdefiniowania położenia osi Y widoku.\nSą one ignorowane, jeśli włączona jest „skala całkowita”." - ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, "Podgląd zakotwiczenia X" diff --git a/intl/msg_hash_pt_br.h b/intl/msg_hash_pt_br.h index 5601b9fb881..33e58515c99 100644 --- a/intl/msg_hash_pt_br.h +++ b/intl/msg_hash_pt_br.h @@ -205,6 +205,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_QUIT_RETROARCH_NOSAVE, "Fecha o RetroArch.\n\"Salvar configuração ao sair\" está desativado." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_QUIT_RETROARCH, + "Sair do RetroArch. Matar o programa de qualquer maneira difícil (SIGKILL, etc.) encerrará o RetroArch sem salvar a configuração. Em Unix-likes, SIGINT/SIGTERM permite uma desinicialização limpa que inclui salvamento de configuração se ativado." + ) /* Main Menu > Load Core */ @@ -511,6 +515,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_SAVESTATE_DETERMINISTIC, "Determinístico (salva/carrega, rebobina, execução antecipada, Netplay)" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE_IN_CONTENT_DIRECTORY, + "- Nota: Os arquivos do sistema estão no Diretório de Conteúdo' está ativado no momento." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CORE_INFO_FIRMWARE_PATH, "- Pesquisando em: \"%s\"" @@ -1196,18 +1204,46 @@ MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_ENABLE, "Tentativa de sincronizar configurações, sram e salvamentos para um provedor de armazenamento em nuvem." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, + "Sincronia de Nuvem Destrutiva" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "Sincronização: Salvas/Estados" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, - "Sync: Configuration Files" + "Sincronização: Arquivos de Configuração" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "Quando ativado, salvar/estados serão sincronizados para a nuvem." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "Quando ativado, os arquivos de configuração serão sincronizados para a nuvem." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, - "When disabled, files are moved to a backup folder before being overwritten or deleted." + "Quando desativado, os arquivos são movidos para uma pasta de backup antes de serem substituídos ou excluídos." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DRIVER, + "Sincronização da nuvem Backend" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_DRIVER, + "Qual protocolo de rede de armazenamento na nuvem usar?" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_URL, "Link do Armazenamento na Nuvem" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_URL, + "A URL para a entrada de API aponta para o serviço de armazenamento em nuvem." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_USERNAME, "Usuário" @@ -1220,6 +1256,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_PASSWORD, "Senha" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_PASSWORD, + "Sua senha para sua conta de armazenamento na nuvem." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_LOGGING_SETTINGS, "Registro de eventos" @@ -2251,18 +2291,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Posição X personalizada da proporção de tela" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Deslocamento personalizado no eixo-X da janela de exibição. \nSerá ignorado caso o \"Dimensionamento com valores inteiros\" estiver ativado." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Posição Y personalizada da proporção de tela" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Deslocamento personalizado no eixo-Y da janela de exibição. \nSerá ignorado caso o \"dimensionamento com valores inteiros\" estiver ativado." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_ru.h b/intl/msg_hash_ru.h index a86bf0e33ec..f084c0e4c08 100644 --- a/intl/msg_hash_ru.h +++ b/intl/msg_hash_ru.h @@ -2565,7 +2565,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Ручная установка смещения области отображения по оси X.\nНе учитывается, если включено 'Целочисленное масштабирование'." + "Установка смещения для определения положения области просмотра по оси X." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2573,13 +2573,61 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Ручная установка смещения области отображения по оси Y.\nНе учитывается, если включено 'Целочисленное масштабирование'." + "Установка смещения для определения положения области просмотра по оси Y." + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, + "Сдвиг области просмотра по X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_X, + "Сдвиг области просмотра по X" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_Y, + "Сдвиг области просмотра по Y" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_Y, + "Сдвиг области просмотра по Y" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_X, + "Установка смещения области просмотра по горизонтали (если ширина превышает высоту контента). 0.0 соответствует левому краю, 1.0 - правому." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_Y, + "Установка смещения области просмотра по вертикали (если высота превышает высоту контента). 0.0 соответствует левому краю, 1.0 - правому." ) #if defined(RARCH_MOBILE) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Сдвиг области просмотра по X (портретный режим)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Сдвиг области просмотра по X (портретный режим)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Сдвиг области просмотра по Y (портретный режим)" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Сдвиг области просмотра по Y (портретный режим)" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_X, + "Установка смещения области просмотра по горизонтали (если ширина превышает высоту контента). 0.0 соответствует левому краю, 1.0 - правому. Для портретного режима." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_BIAS_PORTRAIT_Y, + "Установка смещения области просмотра по вертикали (если высота превышает высоту контента). 0.0 соответствует левому краю, 1.0 - правому. Для портретного режима." + ) #endif MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_WIDTH, - "Пользовательское соотношение сторон (ширина)" + "Ручная установка соотношения сторон (ширина)" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, @@ -2587,7 +2635,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_HEIGHT, - "Пользовательское соотношение сторон (высота)" + "Ручная установка соотношения сторон (высота)" ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_HEIGHT, @@ -2661,7 +2709,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_SWAP_INTERVAL, - "Ручная установка интервала подкачки VSync. Понижает частоту экрана на заданный коэффициент. В режиме 'Автоматически' значение выбирается исходя из частоты обновления ядра, улучшая распределение кадров для контента в 30 fps на дисплеях с 60 Гц либо контента в 60 fps на дисплеях с 120 [...]" + "Ручная установка интервала подкачки VSync. Понижает частоту экрана на заданный коэффициент. В режиме 'Автоматически' значение выбирается исходя из частоты обновления ядра, улучшая распределение кадров контента в 30 к/с на дисплеях 60 Гц либо контента в 60 к/с на дисплеях 120 Гц." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_SWAP_INTERVAL_AUTO, @@ -4099,6 +4147,34 @@ MSG_HASH( MENU_ENUM_SUBLABEL_INPUT_DEVICE_INDEX, "Физический контроллер, опознанный RetroArch." ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVED_DEVICE_NAME, + "Устройство для данного игрока" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_RESERVED_DEVICE_NAME, + "Выбранный контроллер будет присвоен текущему игроку согласно режиму резервирования." + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DEVICE_RESERVATION_NONE, + "Без резервирования" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DEVICE_RESERVATION_PREFERRED, + "Предпочитать" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_DEVICE_RESERVATION_RESERVED, + "Резервировать" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_INPUT_DEVICE_RESERVATION_TYPE, + "Тип резервирования устройства" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_INPUT_DEVICE_RESERVATION_TYPE, + "Предпочитать: при подключении указанного устройства оно будет присвоено данному игроку. Резервировать: не присваивать другие контроллеры данному игроку." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_INPUT_REMAP_PORT, "Порт привязки" @@ -13547,7 +13623,7 @@ MSG_HASH( ) MSG_HASH( MSG_DETECTED_VIEWPORT_OF, - "Найденная область отображения" + "Обнаружена область просмотра" ) MSG_HASH( MSG_DID_NOT_FIND_A_VALID_CONTENT_PATCH, @@ -14237,6 +14313,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "Отправлено %s для %s" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Ранг: %d" /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "Лучший результат: %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Выбор типа миниатюры" @@ -14315,7 +14399,7 @@ MSG_HASH( ) MSG_HASH( MSG_VIEWPORT_SIZE_CALCULATION_FAILED, - "Ошибка расчёта области отображения. Будут использованы необработанные данные. Возможны ошибки." + "Не удалось рассчитать размеры области просмотра. Будут использованы необработанные данные. Возможны ошибки." ) MSG_HASH( MSG_VIRTUAL_DISK_TRAY_EJECT, diff --git a/intl/msg_hash_sr.h b/intl/msg_hash_sr.h index e04e63fab31..0efe471d275 100644 --- a/intl/msg_hash_sr.h +++ b/intl/msg_hash_sr.h @@ -1783,18 +1783,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Postavi odnos ekrana (X pozicija)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Postavi ofset za prozor prikaza kada se definiše pozicija prozora prikaza na X osi.\nOvo se ignoriše ako je 'Celobrojno skaliranje' uključeno." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Postavi odnos ekrana (Y pozicija)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Postavi ofset za prozor prikaza kada se definiše pozicija prozora prikaza na Y osi.\nOvo se ignoriše ako je 'Celobrojno skaliranje' uključeno." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_sv.h b/intl/msg_hash_sv.h index dbe92835037..aab267db7fb 100644 --- a/intl/msg_hash_sv.h +++ b/intl/msg_hash_sv.h @@ -2243,18 +2243,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Anpassa bildformat (X-position)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Anpassad visningsportoffset som används för att definiera X-axelns position för visningsporten.\nDessa ignoreras om 'Heltalsskala' är aktiverat." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Anpassa bildformat (Y-position)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Anpassad visningsportoffset som används för att definiera Y-axelns position för visningsporten.\nDessa ignoreras om 'Heltalsskala' är aktiverat." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_tr.h b/intl/msg_hash_tr.h index 4bdec87015e..1402419eeaa 100644 --- a/intl/msg_hash_tr.h +++ b/intl/msg_hash_tr.h @@ -2545,7 +2545,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Görünüm penceresinin X ekseni konumunu tanımlamak için kullanılan özel görünüm alanı ofseti.\n'Tam sayı Ölçeği' etkinse bunlar yok sayılır." + "Görünüm alanının X ekseni konumunu tanımlamak için kullanılan özel görünüm alanı dengesi." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2553,7 +2553,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Görünüm penceresinin Y ekseni konumunu tanımlamak için kullanılan özel görünüm alanı ofseti.\n'Tam sayı Ölçeği' etkinse bunlar yok sayılır." + "Görünüm alanının Y ekseni konumunu tanımlamak için kullanılan özel görünüm alanı dengesi." ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, @@ -14365,6 +14365,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "%s için %s gönderildi" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Derece: %d" /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "En iyi %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Küçük resim türünü değiştir" diff --git a/intl/msg_hash_uk.h b/intl/msg_hash_uk.h index 3f612a1675b..ffd14478738 100644 --- a/intl/msg_hash_uk.h +++ b/intl/msg_hash_uk.h @@ -1228,10 +1228,22 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_DESTRUCTIVE, "Деструктивна хмарна синхронізація" ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_SAVES, + "Синхронізація: Зберегти/Стани" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CLOUD_SYNC_SYNC_CONFIGS, - "Sync: Configuration Files" + "Синхронізація: Файли конфігурації" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_SAVES, + "Коли увімкнено, збереження чи стани будуть синхронізуватись до хмари." + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_CLOUD_SYNC_SYNC_CONFIGS, + "Коли цей параметр увімкнено, файли конфігурації будуть синхронізовані до хмари." + ) MSG_HASH( MENU_ENUM_SUBLABEL_CLOUD_SYNC_DESTRUCTIVE, "У вимкненому стані, файли переміщуються до резервного каталогу перед перезаписом чи видаленням." @@ -1755,6 +1767,14 @@ MSG_HASH( MENU_ENUM_LABEL_HELP_AUDIO_RESAMPLER_DRIVER_SINC, "Віконна реалізація Sinc." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_RESAMPLER_DRIVER_CC, + "Реалізація згорнутого косинуса." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_AUDIO_RESAMPLER_DRIVER_NEAREST, + "Найближча реалізація ресемплінгу. Цей ресемплер ігнорує налаштування якості." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_CAMERA_DRIVER, "Камера" @@ -1783,6 +1803,26 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_MENU_DRIVER, "Меню" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_MENU_DRIVER, + "Використовувати драйвер меню. (Потрібен перезапуск)" + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_XMB, + "XMB - це графічний інтерфейс RetroArch, який виглядає як меню консолі 7-го покоління. Він може підтримувати ті самі функції, що й Ozone." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_OZONE, + "Ozone - це графічний інтерфейс RetroArch за замовчуванням на більшості платформ. Він оптимізований для навігації за допомогою ігрового контролера." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_RGUI, + "RGUI - це простий вбудований графічний інтерфейс для RetroArch. Він має найнижчі вимоги до продуктивності серед драйверів меню і може використовуватися на екранах з низькою роздільною здатністю." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_MENU_DRIVER_MATERIALUI, + "На мобільних пристроях RetroArch за замовчуванням використовує мобільний інтерфейс MaterialUI. Цей інтерфейс розроблений для сенсорних екранів та вказівних пристроїв, таких як миша/трекбол." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_RECORD_DRIVER, "Запис" @@ -1858,6 +1898,10 @@ MSG_HASH( MENU_ENUM_SUBLABEL_SUSPEND_SCREENSAVER_ENABLE, "Блокувати системну заставку збереження екрану." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_SUSPEND_SCREENSAVER_ENABLE, + "Призупиняє роботу заставки. Підказка, яка не обов'язково має виконуватися відеодрайвером." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_THREADED, "Виокремлене відео" @@ -1866,10 +1910,162 @@ MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_THREADED, "Покращити продуктивність шляхом збільшення затримки та пропуску кадрів. Використовуйте лише якщо не вдалося досягти повної швидкості в інший спосіб." ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_THREADED, + "Використовуйте потоковий відеодрайвер. Це може покращити продуктивність, але може призвести до затримок та більшої кількості заїкань відео." + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION, "Вставка чорного кадра" ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_BLACK_FRAME_INSERTION, + "Вставте чорні рамки між кадрами. Може значно зменшити розмиття руху, імітуючи розгортку ЕПТ, але ціною втрати яскравості. Не поєднуйте з інтервалом заміни > 1, під кадрами, затримкою кадру або синхронізацією до точної частоти кадрів контенту." + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_BLACK_FRAME_INSERTION, + "Вставляє чорні рамки між кадрами для покращення чіткості руху. Використовуйте лише опцію, призначену для поточної частоти оновлення екрана. Не можна використовувати з частотою оновлення, не кратною 60 Гц, наприклад, 144 Гц, 165 Гц тощо. Не поєднуйте з інтервалом заміни > 1, під к[...]" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_120, + "1 - Для частоти оновлення дисплея 120 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_180, + "2 - Для частоти оновлення дисплея 180 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_240, + "3 - Для частоти оновлення дисплея 240 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_300, + "4 - Для частоти оновлення дисплея 300 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_360, + "5 - Для частоти оновлення дисплея 360 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_420, + "6 - Для частоти оновлення дисплея 420 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_480, + "7 - Для частоти оновлення дисплея 480 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_540, + "8 - Для частоти оновлення дисплея 540 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_600, + "9 - Для частоти оновлення дисплея 600 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_660, + "10 - Для частоти оновлення дисплея 660 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_720, + "11 - Для частоти оновлення дисплея 720 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_780, + "12 - Для частоти оновлення дисплея 780 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_840, + "13 - Для частоти оновлення дисплея 840 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_900, + "14 - Для частоти оновлення дисплея 900 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BLACK_FRAME_INSERTION_VALUE_960, + "15 - Для частоти оновлення дисплея 960 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_BFI_DARK_FRAMES, + "Вставка чорного кадру - темні кадри" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_BFI_DARK_FRAMES, + "Налаштуйте кількість чорних кадрів у загальній послідовності розгортки BFI. Чим більше, тим вища чіткість руху, чим менше, тим вища яскравість. Не застосовується на частоті 120 Гц, оскільки для роботи використовується лише 1 кадр BFI. Вищі значення обмежать вас до максимально м[...]" + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_BFI_DARK_FRAMES, + "Дозволяє регулювати кількість чорних кадрів, що відображаються у послідовності bfi. Більша кількість чорних кадрів збільшує чіткість руху, але зменшує яскравість. Не застосовується на 120 Гц, оскільки є лише один додатковий кадр з частотою 60 Гц, тому він має бути чорним, інак[...]" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES, + "Підкадри шейдерів" + ) +MSG_HASH( + MENU_ENUM_SUBLABEL_VIDEO_SHADER_SUBFRAMES, + "Вставляти додаткові кадри шейдерів між кадрами. Дозволяє шейдерам виконувати ефекти з вищою частотою кадрів, ніж реальна частота вмісту. Має бути налаштований на поточну частоту екрана. Не поєднуйте з інтервалом заміни > 1, BFI, затримкою кадру або синхронізацією до точної ч[...]" + ) +MSG_HASH( + MENU_ENUM_LABEL_HELP_VIDEO_SHADER_SUBFRAMES, + "Вставляє додатковий(і) кадр(и) шейдерів між кадрами для будь-яких можливих шейдерних ефектів, які мають працювати швидше за частоту оновлення вмісту. Використовуйте лише той параметр, який призначено для поточної частоти оновлення екрана. Не використовується при частоті [...]" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_120, + "2 - Для частоти оновлення дисплея 120 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_180, + "3 - Для частоти оновлення дисплея 180 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_240, + "4 - Для частоти оновлення дисплея 240 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_300, + "5 - Для частоти оновлення дисплея 300 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_360, + "6 - Для частоти оновлення дисплея 360 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_420, + "7 - Для частоти оновлення дисплея 420 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_480, + "8 - Для частоти оновлення дисплея 480 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_540, + "9 - Для частоти оновлення дисплея 540 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_600, + "10 - Для частоти оновлення дисплея 600 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_660, + "11 - Для частоти оновлення дисплея 660 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_720, + "12 - Для частоти оновлення дисплея 720 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_780, + "13 - Для частоти оновлення дисплея 780 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_840, + "14 - Для частоти оновлення дисплея 840 Гц" + ) +MSG_HASH( + MENU_ENUM_LABEL_VALUE_VIDEO_SHADER_SUBFRAMES_VALUE_900, + "15 - Для частоти оновлення дисплея 900 Гц" + ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_GPU_SCREENSHOT, "Зняток екрану силами GPU" @@ -2351,18 +2547,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Довільне співвідношення сторін (значення X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Задати значення зсуву області перегляду по осі Х.\nІгнорується, якщо включено параметр «Цілочисельне масштабування»." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Довільне співвідношення сторін (значення Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Задати значення зсуву області перегляду по осі Y.\nІгнорується, якщо включено параметр «Цілочисельне масштабування»." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/msg_hash_us.h b/intl/msg_hash_us.h index 0faeea183ee..8080b368639 100644 --- a/intl/msg_hash_us.h +++ b/intl/msg_hash_us.h @@ -2605,7 +2605,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Custom viewport offset used for defining the X-axis position of the viewport.\nThese are ignored if 'Integer Scale' is enabled." + "Custom viewport offset used for defining the X-axis position of the viewport." ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, @@ -2613,7 +2613,7 @@ MSG_HASH( ) MSG_HASH( MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Custom viewport offset used for defining the Y-axis position of the viewport.\nThese are ignored if 'Integer Scale' is enabled." + "Custom viewport offset used for defining the Y-axis position of the viewport." ) MSG_HASH( MENU_ENUM_LABEL_VIDEO_VIEWPORT_BIAS_X, @@ -15057,6 +15057,14 @@ MSG_HASH( MSG_LEADERBOARD_SUBMISSION, "Submitted %s for %s" /* Submitted [value] for [leaderboard name] */ ) +MSG_HASH( + MSG_LEADERBOARD_RANK, + "Rank: %d" /* Rank: [leaderboard rank] */ + ) +MSG_HASH( + MSG_LEADERBOARD_BEST, + "Best: %s" /* Best: [value] */ + ) MSG_HASH( MSG_CHANGE_THUMBNAIL_TYPE, "Change thumbnail type" diff --git a/intl/msg_hash_val.h b/intl/msg_hash_val.h index 2b088388376..a59c856e91b 100644 --- a/intl/msg_hash_val.h +++ b/intl/msg_hash_val.h @@ -1815,18 +1815,10 @@ MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_X, "Relació d'aspecte personalitzat (posició X)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_X, - "Indica el diferencial de posició respecte a l'eix X de l'área de visualització.\nEste valor s'ignorarà si l'opció «Escalar usant nombres sencers» hi és activa." - ) MSG_HASH( MENU_ENUM_LABEL_VALUE_VIDEO_VIEWPORT_CUSTOM_Y, "Relació d'aspecte personalitzat (posició Y)" ) -MSG_HASH( - MENU_ENUM_SUBLABEL_VIDEO_VIEWPORT_CUSTOM_Y, - "Indica el diferencial de posició respecte a l'eix Y de l'área de visualització.\nEste valor s'ignorarà si l'opció «Escalar usant nombres sencers» hi és activa." - ) #if defined(RARCH_MOBILE) #endif MSG_HASH( diff --git a/intl/progress.h b/intl/progress.h index a2fc1f7da54..a4d7a640d20 100644 --- a/intl/progress.h +++ b/intl/progress.h @@ -3,11 +3,11 @@ #define LANGUAGE_PROGRESS_ARABIC_APPROVED 0 /* Asturian */ -#define LANGUAGE_PROGRESS_ASTURIAN_TRANSLATED 10 -#define LANGUAGE_PROGRESS_ASTURIAN_APPROVED 5 +#define LANGUAGE_PROGRESS_ASTURIAN_TRANSLATED 11 +#define LANGUAGE_PROGRESS_ASTURIAN_APPROVED 8 /* Belarusian */ -#define LANGUAGE_PROGRESS_BELARUSIAN_TRANSLATED 36 +#define LANGUAGE_PROGRESS_BELARUSIAN_TRANSLATED 37 #define LANGUAGE_PROGRESS_BELARUSIAN_APPROVED 0 /* Bulgarian */ @@ -19,7 +19,7 @@ #define LANGUAGE_PROGRESS_CATALAN_APPROVED 0 /* Czech */ -#define LANGUAGE_PROGRESS_CZECH_TRANSLATED 96 +#define LANGUAGE_PROGRESS_CZECH_TRANSLATED 95 #define LANGUAGE_PROGRESS_CZECH_APPROVED 0 /* Welsh */ @@ -31,7 +31,7 @@ #define LANGUAGE_PROGRESS_DANISH_APPROVED 0 /* German */ -#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_GERMAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_GERMAN_APPROVED 14 /* Greek */ @@ -39,7 +39,7 @@ #define LANGUAGE_PROGRESS_GREEK_APPROVED 0 /* English, United Kingdom */ -#define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_TRANSLATED 94 +#define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_TRANSLATED 99 #define LANGUAGE_PROGRESS_ENGLISH_UNITED_KINGDOM_APPROVED 0 /* Esperanto */ @@ -47,7 +47,7 @@ #define LANGUAGE_PROGRESS_ESPERANTO_APPROVED 0 /* Spanish */ -#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 100 +#define LANGUAGE_PROGRESS_SPANISH_TRANSLATED 99 #define LANGUAGE_PROGRESS_SPANISH_APPROVED 89 /* Persian */ @@ -75,11 +75,11 @@ #define LANGUAGE_PROGRESS_CROATIAN_APPROVED 0 /* Hungarian */ -#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_HUNGARIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_HUNGARIAN_APPROVED 0 /* Indonesian */ -#define LANGUAGE_PROGRESS_INDONESIAN_TRANSLATED 19 +#define LANGUAGE_PROGRESS_INDONESIAN_TRANSLATED 18 #define LANGUAGE_PROGRESS_INDONESIAN_APPROVED 0 /* Italian */ @@ -87,7 +87,7 @@ #define LANGUAGE_PROGRESS_ITALIAN_APPROVED 0 /* Japanese */ -#define LANGUAGE_PROGRESS_JAPANESE_TRANSLATED 100 +#define LANGUAGE_PROGRESS_JAPANESE_TRANSLATED 99 #define LANGUAGE_PROGRESS_JAPANESE_APPROVED 0 /* Korean */ @@ -119,7 +119,7 @@ #define LANGUAGE_PROGRESS_PORTUGUESE_APPROVED 0 /* Russian */ -#define LANGUAGE_PROGRESS_RUSSIAN_TRANSLATED 99 +#define LANGUAGE_PROGRESS_RUSSIAN_TRANSLATED 100 #define LANGUAGE_PROGRESS_RUSSIAN_APPROVED 14 /* Slovak */ @@ -127,7 +127,7 @@ #define LANGUAGE_PROGRESS_SLOVAK_APPROVED 0 /* Serbian (Latin) */ -#define LANGUAGE_PROGRESS_SERBIAN_LATIN_TRANSLATED 9 +#define LANGUAGE_PROGRESS_SERBIAN_LATIN_TRANSLATED 8 #define LANGUAGE_PROGRESS_SERBIAN_LATIN_APPROVED 0 /* Swedish */ @@ -139,7 +139,7 @@ #define LANGUAGE_PROGRESS_TURKISH_APPROVED 100 /* Ukrainian */ -#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 38 +#define LANGUAGE_PROGRESS_UKRAINIAN_TRANSLATED 40 #define LANGUAGE_PROGRESS_UKRAINIAN_APPROVED 7 /* Valencian */ @@ -152,7 +152,7 @@ /* Chinese Simplified */ #define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_TRANSLATED 99 -#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 45 +#define LANGUAGE_PROGRESS_CHINESE_SIMPLIFIED_APPROVED 44 /* Chinese Traditional */ #define LANGUAGE_PROGRESS_CHINESE_TRADITIONAL_TRANSLATED 88 diff --git a/intl/steam_ast.json b/intl/steam_ast.json index 3e7839041f8..15cd69c7eda 100644 --- a/intl/steam_ast.json +++ b/intl/steam_ast.json @@ -2,13 +2,13 @@ "main-desc": "RetroArch is an open source and cross platform frontend/framework for emulators, game engines, video games, media players and other applications.\n\nWhile it can do many things besides this, it is most widely known for enabling you to run classic games on a wide range of computers and consoles through a slick graphical interface. Settings are also unified so configuration is done once and for all.\n\nIn addition to this, you will soon be able to run original game discs (CDs) from RetroArch. We take videogame preservation seriously and want to ensure you can run your originally bought content on modern day PCs.\n\nRetroArch has advanced features like shaders, netplay, rewinding, next-frame response times, run-ahead, and more!", "final-burn-neo-desc": "[img]{STEAM_APP_IMAGE}/extras/FBN_a2.png[/img]\r\n\r\nFinal Burn Neo (aka FBNeo) is the new official branch of the Final Burn Alpha emulator, which is compatible with hundreds of arcade and console games. The libretro core of FBNeo brings its library of compatible titles to RetroArch, where the core's tight integration with the libretro API allows it to work with RetroArch's advanced time-bending features like rollback-based netplay and run-ahead latency reduction. It includes input presets for automatic mapping of buttons for different games, including fighting game layouts for both modern and old-school arcade controls (aka fightsticks).", "genesis-plus-gx-desc": "[img]{STEAM_APP_IMAGE}/extras/Genesis_Plus_GX_(Phone).png[/img]\r\n\r\nGenesis Plus GX began as a homebrew port of the Genesis Plus emulator for a hacked console before being ported to libretro. With a focus on speed, accuracy and portability, Genesis Plus GX now appears on a variety of platforms and frontends, and is known as one of the most capable and compatible emulators for the consoles it covers, with support for both cartridge and CD-ROM games. It also works well with many of RetroArch's advanced features, such as real-time rewind, run-ahead latency reduction, cheats and RetroAchievements.", - "kronos-desc": "[img]{STEAM_APP_IMAGE}/extras/main.png[/img]\n\nKronos ye una biforcación moderna del emulador UoYabause qu'al empar ye otra biforcación del venerable Yabause. Esti DLC apurre'l nucleu Kronos-libretro pa usalu na interfaz multimedia y de xuegos RetroArch, permitiendo a los usuarios cargar software que seya compatible col emulador.\n\nEsti nucleu usa les funciones modernes d'OpenGL pa fornir una variedá de carauterístiques gráfiques adicionales como una resolución interna mayor, polo que s'aconseya una GPU moderna y potente.\n\nTamién sofita la carga de xuegos dende milenta formatos estremaos, incluyendo ISO, BIN/CUE y el formatu comprimíu CHD. Amás, ríquese que los ficheros de BIOS (saturn_bios.bin y stvbios.zip) se pongan na carpeta «system» de RetroArch o xunto al software que se cargue pa que too funcione correutamente.", + "kronos-desc": "[img]{STEAM_APP_IMAGE}/extras/main.png[/img]\r\n\r\nKronos is a modern fork of the UoYabause emulator, which is itself a fork of the venerable Yabause emulator. This DLC provides the Kronos-libretro core for use with the RetroArch gaming and multimedia interface, allowing users to load software that is compatible with the Kronos emulator.\r\n\r\nKronos utilizes modern OpenGL capabilities to provide a variety of extra graphical features, such as increased internal resolution, so an up-to-date and reasonably powerful GPU is recommended.\r\n\r\nKronos supports loading games from many different formats, including ISO, BIN/CUE and the compressed CHD format, and it requires external BIOS files (saturn_bios.bin and stvbios.zip) placed either in RetroArch's \"system\" folder or alongside the target software in order to function correctly.", "mesen-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img]\r\n\r\nMesen is a highly accurate and feature-filled emulator with support for tons of cartridge mappers (even ones used for weird, unauthorized carts), custom color palettes and HD asset packs. As a libretro core, Mesen supports many advanced features, like softpatching and achievements (through the RetroAchievements service).", - "mesen-s-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img][img]{STEAM_APP_IMAGE}/extras/-S2.png[/img]\n\nMesen S ye un emulador perprecisu y enllenu de carauterístiques d'una consola de 16-bits. Tien una compatibilidá alta, con sofitu pa los chips complementarios que s'usaben en munchos xuegos d'esa dómina mentanto mantién un rindimientu altu. Como nucleu de libretro, Mesen S sofita munches carauterístiques avanzaes como'l parchéu dixital y los llogros (pente'l serviciu de RetroAchievements).", - "mgba-desc": "[img]{STEAM_APP_IMAGE}/extras/mgba.png[/img]\n\nmGBA ye un emulador rápidu y precisu d'una de les consoles portátiles más populares y queríes, y ye compatible con una biblioteca escomanada de xuegos en 8 y 16 bits. Amás del compromisu d'ufrir una reproducción fiel, mGBA tamién tien munches ameyores, incluyendo'l sofitu pa paletes personalizaes en xuegos qu'orixinalmente s'amosaben n'escala de buxos, y berbesos pa xuegos que los incluyíen.\n\nEsti DLC permite que mGBA s'execute pente Retroarch lo que va permitir amestar toles sos ameyores y carauterístiques qu'ínclúin: rebobináu en tiempu real, asolombradores de posprocesamientu y entrada de llatencia baxa p'apurrir una esperiencia de xuegu moderna nos títulos clásicos.", + "mesen-s-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img][img]{STEAM_APP_IMAGE}/extras/-S2.png[/img]\r\n\r\nMesen S is a highly accurate and feature-filled 16bit console emulator. It has high compatibility, with support for the add-on chips used in many games of the era, while also maintaining high performance. As a libretro core, Mesen S supports many advanced features, like softpatching and achievements (through the RetroAchievements service).", + "mgba-desc": "[img]{STEAM_APP_IMAGE}/extras/mgba.png[/img]\r\n\r\nmGBA is a fast, accurate emulator for one of the most popular and well-loved handheld consoles, and it has compatibility with huge library of beloved 8- and 16-bit style games. On top of the commitment to speed and faithful reproduction, mGBA also has a ton of great enhancement features, including support for custom palettes for games that were originally grayscale and displaying borders for games that include them.\r\n\r\nThis DLC allows mGBA to run through RetroArch, which adds all of its enhancements and features, including real-time rewind, extensive post-processing shaders and low-latency input to provide a modern gaming experience even with classic titles.", "pcsx-rearmed-desc": "[img]{STEAM_APP_IMAGE}/extras/PCSX.png[/img]\r\n\r\nPCSX ReARMed is part of a long line of emulators that includes PCSX-Reloaded, PCSX-df and, of course, the original PCSX. This particular fork was originally heavily optimized for devices with ARM CPUs, hence the name, but we've added back in quite a few things to make it work well on typical PC hardware, as well.\r\n\r\nAs a libretro core, this DLC requires the RetroArch interface, where it can be loaded as a core to run games and software that are compatible with the PCSX ReARMed emulator. This core requires a BIOS image (not included) for each region of the software to be placed in RetroArch's \"system\" directory in order to function properly.", - "sameboy-desc": "[img]{STEAM_APP_IMAGE}/extras/SAMEBOY_(Phone).png[/img]\nSameBoy ye un emulador perprecisu conocíu por executar dalgunos xuegos qu'otros emuladores nun son a facer bien. Amás d'esta precisión alta, SameBoy tamién sofita otres carauterístiques interesantes como la capacidá d'escoyer el modelu del preséu a emular independientemente del modelu pal que'l xuegu tuviere diseñáu, paletes de colores esbillables pol usuariu, BIOS HLE integrada y la posibilidá de cargar berbesos nos xuegos que lo sofiten.", - "stella-desc": "[img]{STEAM_APP_IMAGE}/extras/stealla.png[/img]\n\nStella ye un emulador de códigu abiertu y gratuitu d'una de les consoles más influyentes y populares de los 70 y 80. Esti emulador desendolcóse orixinalmente pal sistema operativu GNU/Linux pero col tiempu portóse a munches plataformes estremaes, incluyendo a libretro, que-y permite xugar pente'l sistema multimedia y de xuegos Retroarch.\n\n[img]{STEAM_APP_IMAGE}/extras/2600.png[/img]\n\nAlredor de los últimos años, l'equipu de desendolcu de Stella consiguió superar munchos pilancos a la hora d'imitar el hardware qu'emula Stella, faciéndolu compatible con homebrew, demos y munchos xuegos difíciles d'emular.\n\nPente RetroArch vas poder dar un toque modernu a esti emulador clásicu con sofitu pa rebobináu en tiempu real y RetroAchievements, amás de los meyores asolombradores de RetroArch pa la emulación de pantalles CRT, y muncho más.", - "requirements": "CPU: Intel Pentium 4 y meyor (ríquese una CPU coles instrucciones SSE2) \nCPU aconseyada:Serie Intel Core o l'equivalente n'AMD \nGPU: Cualesquier GPU compatible con OpenGL 2.x o Direct3D11. Pa que funcionen afayadizamente los asolombradores, deberíen sofitar polo menos Shader Model 2.0. \nGPU aconseyada: Intel: Ríquese polo menos Intel HD 4K pa OpenGL, cualesquier GPU compatible con D3D11 pa Direct3D 11. Debería sofitar polo menos Shader Model 3.0 y/o 4.0. \nNotes adicionales: Pa OpenGL: Intel HD 2K/3K GPUs en Windows 10 van usar un controlador pa OpenGL 1.1.", - "legal-limits": "RetroArch ye software llibre y gratuitu, disponible so la llicencia GNU GPL 3.0. \nNun contién nengún material de terceros que contenga copyright, tamién ta a la escontra de la piratería en toles sos formes" + "sameboy-desc": "[img]{STEAM_APP_IMAGE}/extras/SAMEBOY_(Phone).png[/img]\r\nSameBoy is a highly accurate emulator known for successfully running a few games that cause other emulators to stumble. In addition to this high accuracy, SameBoy also sports some nice features like the ability to pick which device model to emulate regardless of what model the game is designed for, user-selectable colorization palettes, built-in HLE BIOS and the ability to load borders on the games that support them.", + "stella-desc": "[img]{STEAM_APP_IMAGE}/extras/stealla.png[/img]\r\n\r\nStella is a free, open-source emulator for one of the most popular and influential home video game consoles of the 1970s and '80s. This emulator was originally developed for use on the GNU/Linux operating system but has, over time, been ported to many different platforms, including libretro, which allows it to play through the RetroArch gaming and multimedia system.\r\n\r\n[img]{STEAM_APP_IMAGE}/extras/2600.png[/img]\r\n\r\nOver the past couple of years, the Stella development team has made great strides in mimicking the many quirks of Stella's target console, making it compatible with many difficult-to-emulate games, homebrew software and demos.\r\n\r\nThrough RetroArch, you can bring a modern touch to this classic emulator, with support for real-time rewind and RetroAchievements, as well as RetroArch's best-in-class shaders for CRT display emulation and more.", + "requirements": "CPU: Intel Pentium 4 and up (CPU with SSE2 instructions required) \nCPU-recommended:Intel Core series or AMD equivalent \nGraphics: Any compliant OpenGL 2.x or Direct3D11 GPU. For shaders to work properly, should support at least Shader Model 2.0. \nGraphics-recommended: Intel: At least Intel HD 4K required for OpenGL, any compliant D3D11 GPU for Direct3D 11. Should support at least Shader Model 3.0 and/or 4.0. \nAdditional notes: For OpenGL: Intel HD 2K/3K GPUs on Windows 10 will have to fall back to an OpenGL 1.1 driver.", + "legal-limits": "RetroArch is free/open source software, available under the GNU GPL 3.0 license. \nIt does not contain any copyrighted material by third parties. RetroArch does not condone piracy in any way, shape or form." } diff --git a/intl/steam_be.json b/intl/steam_be.json index 15cd69c7eda..6131cca2e4e 100644 --- a/intl/steam_be.json +++ b/intl/steam_be.json @@ -1,14 +1,14 @@ { - "main-desc": "RetroArch is an open source and cross platform frontend/framework for emulators, game engines, video games, media players and other applications.\n\nWhile it can do many things besides this, it is most widely known for enabling you to run classic games on a wide range of computers and consoles through a slick graphical interface. Settings are also unified so configuration is done once and for all.\n\nIn addition to this, you will soon be able to run original game discs (CDs) from RetroArch. We take videogame preservation seriously and want to ensure you can run your originally bought content on modern day PCs.\n\nRetroArch has advanced features like shaders, netplay, rewinding, next-frame response times, run-ahead, and more!", - "final-burn-neo-desc": "[img]{STEAM_APP_IMAGE}/extras/FBN_a2.png[/img]\r\n\r\nFinal Burn Neo (aka FBNeo) is the new official branch of the Final Burn Alpha emulator, which is compatible with hundreds of arcade and console games. The libretro core of FBNeo brings its library of compatible titles to RetroArch, where the core's tight integration with the libretro API allows it to work with RetroArch's advanced time-bending features like rollback-based netplay and run-ahead latency reduction. It includes input presets for automatic mapping of buttons for different games, including fighting game layouts for both modern and old-school arcade controls (aka fightsticks).", - "genesis-plus-gx-desc": "[img]{STEAM_APP_IMAGE}/extras/Genesis_Plus_GX_(Phone).png[/img]\r\n\r\nGenesis Plus GX began as a homebrew port of the Genesis Plus emulator for a hacked console before being ported to libretro. With a focus on speed, accuracy and portability, Genesis Plus GX now appears on a variety of platforms and frontends, and is known as one of the most capable and compatible emulators for the consoles it covers, with support for both cartridge and CD-ROM games. It also works well with many of RetroArch's advanced features, such as real-time rewind, run-ahead latency reduction, cheats and RetroAchievements.", - "kronos-desc": "[img]{STEAM_APP_IMAGE}/extras/main.png[/img]\r\n\r\nKronos is a modern fork of the UoYabause emulator, which is itself a fork of the venerable Yabause emulator. This DLC provides the Kronos-libretro core for use with the RetroArch gaming and multimedia interface, allowing users to load software that is compatible with the Kronos emulator.\r\n\r\nKronos utilizes modern OpenGL capabilities to provide a variety of extra graphical features, such as increased internal resolution, so an up-to-date and reasonably powerful GPU is recommended.\r\n\r\nKronos supports loading games from many different formats, including ISO, BIN/CUE and the compressed CHD format, and it requires external BIOS files (saturn_bios.bin and stvbios.zip) placed either in RetroArch's \"system\" folder or alongside the target software in order to function correctly.", - "mesen-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img]\r\n\r\nMesen is a highly accurate and feature-filled emulator with support for tons of cartridge mappers (even ones used for weird, unauthorized carts), custom color palettes and HD asset packs. As a libretro core, Mesen supports many advanced features, like softpatching and achievements (through the RetroAchievements service).", - "mesen-s-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img][img]{STEAM_APP_IMAGE}/extras/-S2.png[/img]\r\n\r\nMesen S is a highly accurate and feature-filled 16bit console emulator. It has high compatibility, with support for the add-on chips used in many games of the era, while also maintaining high performance. As a libretro core, Mesen S supports many advanced features, like softpatching and achievements (through the RetroAchievements service).", - "mgba-desc": "[img]{STEAM_APP_IMAGE}/extras/mgba.png[/img]\r\n\r\nmGBA is a fast, accurate emulator for one of the most popular and well-loved handheld consoles, and it has compatibility with huge library of beloved 8- and 16-bit style games. On top of the commitment to speed and faithful reproduction, mGBA also has a ton of great enhancement features, including support for custom palettes for games that were originally grayscale and displaying borders for games that include them.\r\n\r\nThis DLC allows mGBA to run through RetroArch, which adds all of its enhancements and features, including real-time rewind, extensive post-processing shaders and low-latency input to provide a modern gaming experience even with classic titles.", - "pcsx-rearmed-desc": "[img]{STEAM_APP_IMAGE}/extras/PCSX.png[/img]\r\n\r\nPCSX ReARMed is part of a long line of emulators that includes PCSX-Reloaded, PCSX-df and, of course, the original PCSX. This particular fork was originally heavily optimized for devices with ARM CPUs, hence the name, but we've added back in quite a few things to make it work well on typical PC hardware, as well.\r\n\r\nAs a libretro core, this DLC requires the RetroArch interface, where it can be loaded as a core to run games and software that are compatible with the PCSX ReARMed emulator. This core requires a BIOS image (not included) for each region of the software to be placed in RetroArch's \"system\" directory in order to function properly.", - "sameboy-desc": "[img]{STEAM_APP_IMAGE}/extras/SAMEBOY_(Phone).png[/img]\r\nSameBoy is a highly accurate emulator known for successfully running a few games that cause other emulators to stumble. In addition to this high accuracy, SameBoy also sports some nice features like the ability to pick which device model to emulate regardless of what model the game is designed for, user-selectable colorization palettes, built-in HLE BIOS and the ability to load borders on the games that support them.", - "stella-desc": "[img]{STEAM_APP_IMAGE}/extras/stealla.png[/img]\r\n\r\nStella is a free, open-source emulator for one of the most popular and influential home video game consoles of the 1970s and '80s. This emulator was originally developed for use on the GNU/Linux operating system but has, over time, been ported to many different platforms, including libretro, which allows it to play through the RetroArch gaming and multimedia system.\r\n\r\n[img]{STEAM_APP_IMAGE}/extras/2600.png[/img]\r\n\r\nOver the past couple of years, the Stella development team has made great strides in mimicking the many quirks of Stella's target console, making it compatible with many difficult-to-emulate games, homebrew software and demos.\r\n\r\nThrough RetroArch, you can bring a modern touch to this classic emulator, with support for real-time rewind and RetroAchievements, as well as RetroArch's best-in-class shaders for CRT display emulation and more.", - "requirements": "CPU: Intel Pentium 4 and up (CPU with SSE2 instructions required) \nCPU-recommended:Intel Core series or AMD equivalent \nGraphics: Any compliant OpenGL 2.x or Direct3D11 GPU. For shaders to work properly, should support at least Shader Model 2.0. \nGraphics-recommended: Intel: At least Intel HD 4K required for OpenGL, any compliant D3D11 GPU for Direct3D 11. Should support at least Shader Model 3.0 and/or 4.0. \nAdditional notes: For OpenGL: Intel HD 2K/3K GPUs on Windows 10 will have to fall back to an OpenGL 1.1 driver.", - "legal-limits": "RetroArch is free/open source software, available under the GNU GPL 3.0 license. \nIt does not contain any copyrighted material by third parties. RetroArch does not condone piracy in any way, shape or form." + "main-desc": "RetroArch уяўляе сабой адкрытую крос-платформавую абалонку/фрэймворк для эмулятараў, гульнявых рухавічкоў, відэагульняў, медыяпрайгравальнікаў і іншых прыкладанняў.\n\nНягледзячы на ​​багацце магчымасцяў, RetroArch найболей вядомы як сродак з гнуткім графічным інтэрфейсам для запуску класічных гульняў ад мноства кампутараў і кансоляў. Канфігурацыя вырабляецца адзін раз дзякуючы ўніфікаваным наладам.\n\nУ дадатак да гэтага, неўзабаве вы зможаце запускаць у RetroArch арыгінальныя дыскі (CDs) з гульнямі. Мы адказна падыходзім да справы захавання відэагульняў і жадаем, каб вы мелі магчымасць гуляць у набыты вамі арыгінальны кантэнт на сучасных ПК.\n\nRetroArch прапануе пашыраныя магчымасці, уключаючы шэйдары, сеткавую гульню, перамотку, водгук на наступным кадры, забяганне і многае іншае!", + "final-burn-neo-desc": "[img]{STEAM_APP_IMAGE}/extras/FBN_a2.png[/img]\n\nFinal Burn Neo (aka FBNeo) – гэта новае афіцыйнае адгалінаванне эмулятара Final Burn Alpha, сумяшчальнае з сотнямі аркадных і кансольных гульняў. Ядро FBNeo для libretro дадае сваю бібліятэку сумяшчальных гульняў у RetroArch, дзе цесная інтэграцыя з libretro API дазваляе ядру выкарыстаць такія магчымасці RetroArch як rollback-мультыплэер і памяншэнне затрымкі ўводу з дапамогай забегання. У ядро ​​ўбудаваны профілі ўводу для аўтаматычнай прывязкі кнопак у розных гульнях, у тым ліку раскладкі файтынгаў для сучасных і класічных аркадных кантролераў (файтстыкаў).", + "genesis-plus-gx-desc": "[img]{STEAM_APP_IMAGE}/extras/Genesis_Plus_GX_(Phone).png[/img]\n\nGenesis Plus GX да партавання пад libretro пачынаў развіццё як homebrew-порт эмулятара Genesis Plus для ўзламанай кансолі. З упорам на хуткасць, дакладнасць і партуймасць, у наш час Genesis Plus GX даступны на мностве платформаў і фронтэндаў і вядомы як адзін з самых функцыянальных і сумяшчальных эмулятараў кансоляў, з падтрымкай гульняў на картрыджах і кампакт-дысках. Ён таксама паспяхова ўзаемадзейнічае з пашыранымі магчымасцямі RetroArch, уключаючы перамотку ў рэальным часе, зніжэнне затрымкі ўводу з дапамогай забегання, Чыты і RetroAchievements.", + "kronos-desc": "[img]{STEAM_APP_IMAGE}/extras/main.png[/img]\n\nKronos - гэта сучасны форк эмулятара UoYabause, які, у сваю чаргу, з'яўляецца адгалінаваннем вядомага эмулятара Yabause. Дадзены DLC забяспечвае ўзаемадзеянне ядра Kronos для libretro з мультымедыйна-гульнявым інтэрфейсам RetroArch, дазваляючы карыстачам запускаць сумяшчальнае з Kronos праграмнае забеспячэнне.\n\nKronos выкарыстоўвае патэнцыял OpenGL для рэалізацыі пашыраных графічных магчымасцяў, такіх як павышэнне ўнутранага дазволу, патрабуючы наяўнасці дастаткова магутнага сучаснага GPU.\n\nKronos падтрымлівае загрузку гульняў у розных фарматах, у тым ліку ISO, BIN/CUE і фармат сціску CHD. Для правільнай працы ядра неабходна наяўнасць дадатковых файлаў BIOS (saturn_bios.bin і stvbios.zip) у тэчцы RetroArch \"system\" ці ў адной тэчцы з якой запускаецца праграмнае забеспячэнне.", + "mesen-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img]\n\nMesen - высокадакладны шматфункцыянальны эмулятар з падтрымкай мноства мапераў (уключаючы ад нестандартных неафіцыйных картрыджаў), карыстальніцкіх каляровых палітраў і загрузкай HD-тэкстур. У якасці ядра libretro Mesen падтрымлівае шэраг прасунутых функцый, такіх як софтпатчынг і дасягненні (з дапамогай сэрвісу RetroAchievements).", + "mesen-s-desc": "[img]{STEAM_APP_IMAGE}/extras/mesen2.png[/img][img]{STEAM_APP_IMAGE}/extras/-S2.png[/img]\n\nMesen – высокадакладны шматфункцыянальны эмулятар 16-бітнай прыстаўкі. Мае высокаю сумяшчальнасць з класічнымі гульнямі, у тым ліку эмуляцыю чыпаў пашырэнняў, у той жа час захоўваючы добрую прадукцыйнасць. У якасці ядра libretro Mesen падтрымлівае мноства прасунутых функцый, такіх як софтпатчынг і дасягненні (пасродкам сэрвісу RetroAchievements).", + "mgba-desc": "[img]{STEAM_APP_IMAGE}/extras/mgba.png[/img]\n\nmGBA - хуткі і дакладны эмулятар адной з самых папулярных кансоляў, сумяшчальны з мноствам вядомых 8 - і 16-бітных гульняў. Нароўні з высокай дакладнасцю і хуткасцю эмуляцыі, mGBA мае шмат паляпшэнняў, сярод якіх загрузка карыстальніцкіх палітраў для гульняў з арыгінальнай выявай у адценнях шэрага і адлюстраваннем рамак у гульнях з іх падтрымкай.\n\nДадзены DLC дазваляе mGBA працаваць у RetroArch і выкарыстоўваць усе яго магчымасці, уключаючы перамотку ў рэальным часе, шэйдары постапрацоўкі і памяншэнне затрымкі ўводу для надання сучаснага аблічча нават класічным гульняў.", + "pcsx-rearmed-desc": "[img]{STEAM_APP_IMAGE}/extras/PCSX.png[/img]\n\nPCSX ReARMed з'яўляецца часткай шырокай лінейкі эмулятараў, у якую ўваходзяць PCSX-Reloaded, PCSX-df і арыгінальны PCSX. Як паходзіць з назвы, дадзены форк першапачаткова быў аптымізаваны для прылад з працэсарамі ARM, але пазней атрымаў шэраг змен для працы на звычайных ПК.\n\nУ якасці ядра libretro дадзенаму DLC неабходны інтэрфейс RetroArch, які дазваляе загрузіць ядро ​​і выкарыстоўваць яго для запуску гульняў і праграм, сумяшчальных з эмулятарам PCSX ReARMed. Для правільнай працы ядра патрабуюцца выявы BIOS кожнага рэгіёна (не ўключаны ў дадатак), скапіяваныя ў сістэмны каталог RetroArch.", + "sameboy-desc": "[img]{STEAM_APP_IMAGE}/extras/SAMEBOY_(Phone).png[/img]\nSameBoy - гэта высокадакладны эмулятар, які паспяхова запускае нават тыя гульні, перад якімі пасуюць усе іншыя эмулятары. Акрамя высокай дакладнасці, SameBoy мае шэраг прыемных асаблівасцяў, такіх як выбар эмуляванай мадэлі прылады незалежна ад тыпу гульні, каляровыя палітры па выбары карыстальніка, убудаваны HLE BIOS, а таксама магчымасць загрузкі рамак для гульняў з іх падтрымкай.", + "stella-desc": "[img]{STEAM_APP_IMAGE}/extras/stealla.png[/img]\n\nStella – гэта бясплатны open source эмулятар адной з самых папулярных і знакавых гульнявых кансоляў 1970-х і 80-х. Першапачаткова распрацаваны для аперацыйных сістэм GNU/Linux, эмулятар з часам быў партаваны на мноства іншых платформаў, у тым ліку libretro, які запускае яго з дапамогай гульнявой мультымедыйнай сістэмы RetroArch.\n\n[img]{STEAM_APP_IMAGE}/extras/2600.png[/img]\n\nЗа апошнія гады распрацоўнікі Stella дамагліся значных поспехаў у імітацыі шматлікіх асаблівасцяў падтрымкі Stella кансоляў, забяспечыўшы сумяшчальнасць з масай цяжкаэмуляваных гульняў, homebrew праграм і дэмак.\n\nRetroArch дазволіць надаць гэтаму класічнаму эмулятару сучаснае аблічча з дапамогай перамоткі ў рэальным часе, RetroAchievements, лепшых у сваім класе шэйдараў для эмуляцыі ЭПТ-дысплеяў і іншых магчымасцяў.", + "requirements": "Працэсар: Intel Pentium 4 ці вышэй (з абавязковай падтрымкай SSE2) \nПрацэсар (рэкамендуецца): Intel Core або эквівалентны AMD \nГрафіка: любы GPU з падтрымкай OpenGL 2.x ці Direct3D11. Падтрымка Shader Model не ніжэй версіі 2.0 для карэктнай працы шэйдараў \nГрафіка (рэкамендуецца): Intel: не ніжэй Intel HD 4K для OpenGL, любы GPU, сумяшчальны з D3D11 для Direct3D 11. Падтрымка Shader Model не ніжэй 3.0 і/або 4.0. \nЗаўвага: для OpenGL: на Windows 10 графічныя чыпы Intel HD 2K/3K будуць выкарыстоўваць драйвер OpenGL 1.1.", + "legal-limits": "RetroArch з'яўляецца бясплатным праграмным забеспячэннем з адкрытым зыходным кодам, які распаўсюджваецца па ліцэнзіі GNU GPL 3.0.\nНе змяшчае матэрыялы трэціх асоб, абароненыя аўтарскім правам. RetroArch не патурае пірацтву ў любой форме." } diff --git a/libretro-common/audio/dsp_filters/vibrato.c b/libretro-common/audio/dsp_filters/vibrato.c index 2db906bb034..0f3a804cde1 100644 --- a/libretro-common/audio/dsp_filters/vibrato.c +++ b/libretro-common/audio/dsp_filters/vibrato.c @@ -90,7 +90,7 @@ float vibratocore_core(struct vibrato_core *core,float in) float lfo = sin(M * 2. * M_PI * core->phase++); int maxdelay = VIBRATO_BASE_DELAY_SEC * core->samplerate; core->phase = core->phase % maxphase; - lfo = (lfo + 1) * 1.; // transform from [-1; 1] to [0; 1] + lfo = (lfo + 1) * 1.; /* Transform from [-1; 1] to [0; 1] */ delay = lfo * core->depth * maxdelay; delay += VIBRATO_ADD_DELAY; readindex = core->writeindex - 1 - delay; diff --git a/libretro-common/encodings/encoding_crc32.c b/libretro-common/encodings/encoding_crc32.c index 79e2b177fb8..f18f8ad3fea 100644 --- a/libretro-common/encodings/encoding_crc32.c +++ b/libretro-common/encodings/encoding_crc32.c @@ -37,7 +37,7 @@ uint32_t encoding_crc32(uint32_t crc, const uint8_t *data, size_t len) { crc = ~crc; - // Align data if it is not aligned + /* Align data if it is not aligned */ while (((uintptr_t)data & 7) && len > 0) { crc = __crc32b(crc, *(uint8_t *)data); diff --git a/libretro-common/file/archive_file_zlib.c b/libretro-common/file/archive_file_zlib.c index f9cd64be5c8..79d02244017 100644 --- a/libretro-common/file/archive_file_zlib.c +++ b/libretro-common/file/archive_file_zlib.c @@ -130,20 +130,20 @@ static bool zlib_stream_decompress_data_to_file_init( offsetEL = read_le(local_header + 2, 2); /* extra field length */ offsetData = (int64_t)(size_t)cdata + 26 + 4 + offsetNL + offsetEL; - zip_context->fdoffset = offsetData; - zip_context->usize = size; - zip_context->csize = csize; - zip_context->boffset = 0; - zip_context->cmode = cmode; - zip_context->decompressed_data = (uint8_t*)malloc(size); - zip_context->zstream = NULL; - zip_context->tmpbuf = NULL; + zip_context->fdoffset = offsetData; + zip_context->usize = size; + zip_context->csize = csize; + zip_context->boffset = 0; + zip_context->cmode = cmode; + zip_context->decompressed_data = (uint8_t*)malloc(size); + zip_context->zstream = NULL; + zip_context->tmpbuf = NULL; if (cmode == ZIP_MODE_DEFLATED) { /* Initialize the zlib inflate machinery */ - zip_context->zstream = (z_stream*)malloc(sizeof(z_stream)); - zip_context->tmpbuf = malloc(_READ_CHUNK_SIZE); + zip_context->zstream = (z_stream*)malloc(sizeof(z_stream)); + zip_context->tmpbuf = (uint8_t*)malloc(_READ_CHUNK_SIZE); zip_context->zstream->next_in = NULL; zip_context->zstream->avail_in = 0; diff --git a/libretro-common/include/array/rbuf.h b/libretro-common/include/array/rbuf.h index deb045fbbb9..9af8769cb06 100644 --- a/libretro-common/include/array/rbuf.h +++ b/libretro-common/include/array/rbuf.h @@ -50,11 +50,11 @@ * -- Explicitly increase allocated memory and set capacity: * RBUF_FIT(buf, 100); * -- now RBUF_LEN(buf) == 0, RBUF_CAP(buf) == 100 - * + * * -- Resize buffer (does not initialize or zero memory!) * RBUF_RESIZE(buf, 200); * -- now RBUF_LEN(buf) == 200, RBUF_CAP(buf) == 200 - * + * * -- To handle running out of memory: * bool ran_out_of_memory = !RBUF_TRYFIT(buf, 1000); * -- before RESIZE or PUSH. When out of memory, buf will stay unmodified. @@ -89,7 +89,7 @@ struct rbuf__hdr __attribute__((__unused__)) #elif defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4505) //unreferenced local function has been removed +#pragma warning(disable:4505) /* Unreferenced local function has been removed */ #endif static void *rbuf__grow(void *buf, size_t new_len, size_t elem_size) diff --git a/libretro-common/include/array/rhmap.h b/libretro-common/include/array/rhmap.h index b302a3010d6..8bdeac41017 100644 --- a/libretro-common/include/array/rhmap.h +++ b/libretro-common/include/array/rhmap.h @@ -104,7 +104,6 @@ #include /* for memcpy, memset */ #include /* for ptrdiff_t, size_t */ #include /* for uint32_t */ -#include /* for strlen */ #define RHMAP_LEN(b) ((b) ? RHMAP__HDR(b)->len : 0) #define RHMAP_MAX(b) ((b) ? RHMAP__HDR(b)->maxlen : 0) @@ -132,7 +131,7 @@ #if defined(_MSC_VER) #pragma warning(push) -#pragma warning(disable:4505) //unreferenced local function has been removed +#pragma warning(disable:4505) /* Unreferenced local function has been removed */ #endif #define RHMAP_SET_FULL(b, key, str, val) (RHMAP__FIT1(b), b[rhmap__idx(RHMAP__HDR(b), (key), (str), 1, 0)] = (val)) @@ -229,6 +228,23 @@ RHMAP__UNUSED static void* rhmap__grow(void* old_ptr, size_t elem_size, size_t r return new_vals; } +/* This is just a custom version of strdup so we don't have an inherent + * dependency on strdup for this file. It is functionally equivalent to + * a system-provided strdup */ +static char *rhmap_strdup(const char *s) +{ + char *out; + int count = 0; + while (s[count]) + ++count; + ++count; + out = (char*)malloc(sizeof(char) * count); + out[--count] = 0; + while (--count >= 0) + out[count] = s[count]; + return out; +} + RHMAP__UNUSED static ptrdiff_t rhmap__idx(struct rhmap__hdr* hdr, uint32_t key, const char * str, int add, size_t del) { uint32_t i; @@ -263,17 +279,10 @@ RHMAP__UNUSED static ptrdiff_t rhmap__idx(struct rhmap__hdr* hdr, uint32_t key, { if (add) { - int l; - char *t; - hdr->len++; hdr->keys[i] = key; - l = strlen(str); - t = malloc(l + 1); - memcpy(t, str, l); - t[l] = '\0'; if (str) - hdr->key_strs[i] = t; + hdr->key_strs[i] = rhmap_strdup(str); return (ptrdiff_t)i; } return (ptrdiff_t)-1; diff --git a/libretro-common/include/defines/psp_defines.h b/libretro-common/include/defines/psp_defines.h index 5f7b7cf08d4..9aa6814e514 100644 --- a/libretro-common/include/defines/psp_defines.h +++ b/libretro-common/include/defines/psp_defines.h @@ -51,7 +51,7 @@ int sceClibPrintf ( const char * format, ... ); #define PSP_FB_HEIGHT 544 #define PSP_PITCH_PIXELS 1024 - // Memory left to the system for threads and other internal stuffs +/* Memory left to the system for threads and other internal stuffs */ #ifdef SCE_LIBC_SIZE #define RAM_THRESHOLD 0x2000000 + SCE_LIBC_SIZE #else diff --git a/libretro-common/include/glsym/switch/nx_gl.h b/libretro-common/include/glsym/switch/nx_gl.h index f4f37c07d93..17c654ee766 100644 --- a/libretro-common/include/glsym/switch/nx_gl.h +++ b/libretro-common/include/glsym/switch/nx_gl.h @@ -35,7 +35,7 @@ extern "C" { #define APIENTRYP APIENTRY * #endif -// GL.h types +/* GL.h types */ typedef unsigned int GLenum; typedef unsigned char GLboolean; typedef unsigned int GLbitfield; @@ -52,7 +52,7 @@ typedef float GLclampf; /* single precision float in [0,1] */ typedef double GLdouble; /* double precision float */ typedef double GLclampd; /* double precision float in [0,1] */ -// GL.h defines +/* GL.h defines */ #define GL_ARB_imaging 1 #define GL_FALSE 0 #define GL_TRUE 1 @@ -845,4 +845,4 @@ typedef double GLclampd; /* double precision float in [0,1] */ } #endif -#endif // __NX_GL_H__ +#endif /* __NX_GL_H__ */ diff --git a/libretro-common/include/glsym/switch/nx_glsym.h b/libretro-common/include/glsym/switch/nx_glsym.h index ce112234c8a..94863ebd5d2 100644 --- a/libretro-common/include/glsym/switch/nx_glsym.h +++ b/libretro-common/include/glsym/switch/nx_glsym.h @@ -925,4 +925,4 @@ RGLSYMGLBINDTEXTURESPROC glBindTextures; #ifdef __cplusplus } #endif -#endif // __NX_GLSYM_H__ +#endif /* __NX_GLSYM_H__ */ diff --git a/libretro-common/libco/x86.c b/libretro-common/libco/x86.c index 24e5aa6ce28..b7d57d37a44 100644 --- a/libretro-common/libco/x86.c +++ b/libretro-common/libco/x86.c @@ -25,7 +25,7 @@ static thread_local long co_active_buffer[64]; static thread_local cothread_t co_active_handle = 0; static void (fastcall *co_swap)(cothread_t, cothread_t) = 0; -//ABI: fastcall +/* ABI: fastcall */ static unsigned char co_swap_function[] = { 0x89, 0x22, /* mov [edx],esp */ 0x8b, 0x21, /* mov esp,[ecx] */ diff --git a/libretro-common/net/net_socket_ssl_mbed.c b/libretro-common/net/net_socket_ssl_mbed.c index a0a524f3559..69c2239002e 100644 --- a/libretro-common/net/net_socket_ssl_mbed.c +++ b/libretro-common/net/net_socket_ssl_mbed.c @@ -35,8 +35,13 @@ #include "../../deps/mbedtls/mbedtls/ctr_drbg.h" #include "../../deps/mbedtls/mbedtls/entropy.h" #else +#include +#if MBEDTLS_VERSION_MAJOR < 3 #include #include +#else +#include +#endif #include #include #include diff --git a/libretro-common/rthreads/ctr_pthread.h b/libretro-common/rthreads/ctr_pthread.h index 5582af1a9d7..46290c78447 100644 --- a/libretro-common/rthreads/ctr_pthread.h +++ b/libretro-common/rthreads/ctr_pthread.h @@ -162,7 +162,7 @@ static INLINE int pthread_create(pthread_t *thread, { s32 prio = 0; Thread new_ctr_thread; - int procnum = -2; // use default cpu + int procnum = -2; /* use default cpu */ bool isNew3DS; APT_CheckNew3DS(&isNew3DS); @@ -176,7 +176,7 @@ static INLINE int pthread_create(pthread_t *thread, mutex_inited = true; } - /*Must wait if attempting to launch 2 threads at once to prevent corruption of function pointer*/ + /* Must wait if attempting to launch 2 threads at once to prevent corruption of function pointer*/ while (LightLock_TryLock(&safe_double_thread_launch) != 0); svcGetThreadPriority(&prio, CUR_THREAD_HANDLE); diff --git a/libretro-common/rthreads/psp_pthread.h b/libretro-common/rthreads/psp_pthread.h index f320969db2f..5669bf08d28 100644 --- a/libretro-common/rthreads/psp_pthread.h +++ b/libretro-common/rthreads/psp_pthread.h @@ -302,4 +302,4 @@ static INLINE int pthread_equal(pthread_t t1, pthread_t t2) return t1 == t2; } -#endif //_PSP_PTHREAD_WRAP__ +#endif /* _PSP_PTHREAD_WRAP__ */ diff --git a/libretro-common/test/string/test_stdstring.c b/libretro-common/test/string/test_stdstring.c index 4250c1f7d2f..1706e442caa 100644 --- a/libretro-common/test/string/test_stdstring.c +++ b/libretro-common/test/string/test_stdstring.c @@ -268,7 +268,9 @@ START_TEST (test_utf8_util) ck_assert_uint_eq(3592, utf8_walk(tptr)); ck_assert_uint_eq(131108, utf8_walk(tptr)); - //ck_assert_uint_eq(1, utf8cpy(out, 64, test1, 1)); +#if 0 + ck_assert_uint_eq(1, utf8cpy(out, 64, test1, 1)); +#endif } END_TEST diff --git a/libretro-db/libretrodb.c b/libretro-db/libretrodb.c index a846b6d6372..13bb4e8b79a 100644 --- a/libretro-db/libretrodb.c +++ b/libretro-db/libretrodb.c @@ -290,7 +290,7 @@ int libretrodb_find_entry(libretrodb_t *db, const char *index_name, return -1; bufflen = idx.next; - if (!(buff = malloc(bufflen))) + if (!(buff = (uint8_t*)malloc(bufflen))) return -1; while (nread < bufflen) @@ -457,13 +457,9 @@ int libretrodb_create_index(libretrodb_t *db, int rval = -1; if (libretrodb_find_index(db, name, &idx) >= 0) - { return 1; - } if (!db->can_write) - { return -1; - } tree = bintree_new(node_compare, &field_size); diff --git a/menu/cbs/menu_cbs_sublabel.c b/menu/cbs/menu_cbs_sublabel.c index 43058d5ea7b..f7851303504 100644 --- a/menu/cbs/menu_cbs_sublabel.c +++ b/menu/cbs/menu_cbs_sublabel.c @@ -104,7 +104,6 @@ static int menu_action_sublabel_contentless_core(file_list_t *list, const char *core_path = path; core_info_t *core_info = NULL; const contentless_core_info_entry_t *entry = NULL; - const char *menu_ident = menu_driver_ident(); bool display_runtime = true; settings_t *settings = config_get_ptr(); bool playlist_show_sublabels = settings->bools.playlist_show_sublabels; @@ -121,6 +120,9 @@ static int menu_action_sublabel_contentless_core(file_list_t *list, menu_timedate_date_separator = (enum playlist_sublabel_last_played_date_separator_type) settings->uints.menu_timedate_date_separator; +#if defined(HAVE_OZONE) || defined(HAVE_MATERIALUI) + const char *menu_ident = menu_driver_ident(); +#endif if (playlist_show_sublabels) { @@ -5056,7 +5058,7 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, break; case MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_sync_configs); - break; + break; case MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER: BIND_ACTION_SUBLABEL(cbs, action_bind_sublabel_cloud_sync_driver); break; @@ -5667,18 +5669,22 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, /* Entries with %u player index placeholder. */ info_single_list_t info_list[] = { -/* { +#if 0 + { MENU_ENUM_LABEL_INPUT_LIBRETRO_DEVICE, NULL - },*/ + }, +#endif { MENU_ENUM_LABEL_INPUT_PLAYER_ANALOG_DPAD_MODE, action_bind_sublabel_input_adc_type }, -/* { +#if 0 + { MENU_ENUM_LABEL_INPUT_DEVICE_INDEX, NULL - },*/ + }, +#endif { MENU_ENUM_LABEL_INPUT_DEVICE_RESERVATION_TYPE, action_bind_sublabel_input_device_reservation_type @@ -5691,10 +5697,12 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, MENU_ENUM_LABEL_INPUT_MOUSE_INDEX, action_bind_sublabel_input_mouse_index }, -/* { +#if 0 + { MENU_ENUM_LABEL_INPUT_REMAP_PORT, NULL - },*/ + }, +#endif { MENU_ENUM_LABEL_INPUT_JOYPAD_INDEX, action_bind_sublabel_input_device_index @@ -5716,16 +5724,14 @@ int menu_cbs_init_bind_sublabel(menu_file_list_cbs_t *cbs, const char* idx_placeholder = "%u"; for (i = 0; i < ARRAY_SIZE(info_list); i++) { - int idxpos = -1; - idxpos = string_find_index_substring_string(msg_hash_to_str(info_list[i].label_idx), idx_placeholder); - if ( idxpos > 0 && - string_starts_with_size(label, msg_hash_to_str(info_list[i].label_idx), idxpos) && - (( (size_t) idxpos == strlen(msg_hash_to_str(info_list[i].label_idx)) - 2) || - ( (size_t) idxpos < strlen(msg_hash_to_str(info_list[i].label_idx)) - 2 && - string_ends_with_size(label, - msg_hash_to_str(info_list[i].label_idx)+idxpos+2, - lbl_len, - strlen(msg_hash_to_str(info_list[i].label_idx))-idxpos-2)))) + int idxpos = string_find_index_substring_string(msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx), idx_placeholder); + if ( (idxpos > 0) + && string_starts_with_size(label, msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx), idxpos) + && (((size_t)idxpos == strlen(msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx)) - 2) + || ((size_t)idxpos < strlen(msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx)) - 2 && string_ends_with_size(label, + msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx) + idxpos + 2, + lbl_len, + strlen(msg_hash_to_str((enum msg_hash_enums)info_list[i].label_idx))-idxpos-2)))) { BIND_ACTION_SUBLABEL(cbs, info_list[i].cb); return 0; diff --git a/menu/menu_displaylist.c b/menu/menu_displaylist.c index 3aed5bdb082..887532c5d4a 100644 --- a/menu/menu_displaylist.c +++ b/menu/menu_displaylist.c @@ -9832,17 +9832,14 @@ unsigned menu_displaylist_build_list( count++; break; case ASPECT_RATIO_CUSTOM: - if (!settings->bools.video_scale_integer) - { - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, - MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X, - PARSE_ONLY_INT, false) == 0) - count++; - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, - MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y, - PARSE_ONLY_INT, false) == 0) - count++; - } + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_X, + PARSE_ONLY_INT, false) == 0) + count++; + if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_Y, + PARSE_ONLY_INT, false) == 0) + count++; if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, MENU_ENUM_LABEL_VIDEO_VIEWPORT_CUSTOM_WIDTH, PARSE_ONLY_UINT, false) == 0) @@ -10707,20 +10704,25 @@ unsigned menu_displaylist_build_list( break; case DISPLAYLIST_CLOUD_SYNC_SETTINGS_LIST: { - menu_displaylist_build_info_t build_list[] = { - {MENU_ENUM_LABEL_CLOUD_SYNC_ENABLE, PARSE_ONLY_BOOL }, - {MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE, PARSE_ONLY_BOOL }, - {MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES, PARSE_ONLY_BOOL }, - {MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS, PARSE_ONLY_BOOL }, - {MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER, PARSE_ONLY_STRING_OPTIONS }, - {MENU_ENUM_LABEL_CLOUD_SYNC_URL, PARSE_ONLY_STRING }, - {MENU_ENUM_LABEL_CLOUD_SYNC_USERNAME, PARSE_ONLY_STRING }, - {MENU_ENUM_LABEL_CLOUD_SYNC_PASSWORD, PARSE_ONLY_STRING }, + menu_displaylist_build_info_selective_t build_list[] = { + {MENU_ENUM_LABEL_CLOUD_SYNC_ENABLE, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_CLOUD_SYNC_DESTRUCTIVE, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_SAVES, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_CLOUD_SYNC_SYNC_CONFIGS, PARSE_ONLY_BOOL, true}, + {MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER, PARSE_ONLY_STRING_OPTIONS, true}, + {MENU_ENUM_LABEL_CLOUD_SYNC_URL, PARSE_ONLY_STRING, false}, + {MENU_ENUM_LABEL_CLOUD_SYNC_USERNAME, PARSE_ONLY_STRING, false}, + {MENU_ENUM_LABEL_CLOUD_SYNC_PASSWORD, PARSE_ONLY_STRING, false}, }; + if (string_is_equal(settings->arrays.cloud_sync_driver, "webdav")) + for (i = 0; i < ARRAY_SIZE(build_list); i++) + build_list[i].checked = true; + for (i = 0; i < ARRAY_SIZE(build_list); i++) { - if (MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, + if (build_list[i].checked && + MENU_DISPLAYLIST_PARSE_SETTINGS_ENUM(list, build_list[i].enum_idx, build_list[i].parse_type, false) == 0) count++; @@ -15093,20 +15095,20 @@ bool menu_displaylist_ctl(enum menu_displaylist_ctl_state type, _len += strlcpy(new_exts + _len, "bmp", sizeof(new_exts) - _len); #endif #ifdef HAVE_RPNG - if (new_exts[_len-1] != '\0') + if (_len > 0 && (new_exts[_len-1] != '\0')) _len += strlcpy(new_exts + _len, "|", sizeof(new_exts) - _len); _len += strlcpy(new_exts + _len, "png", sizeof(new_exts) - _len); #endif #ifdef HAVE_RJPEG - if (new_exts[_len-1] != '\0') + if (_len > 0 && (new_exts[_len-1] != '\0')) _len += strlcpy(new_exts + _len, "|", sizeof(new_exts) - _len); _len += strlcpy(new_exts + _len, "jpeg", sizeof(new_exts) - _len); - if (new_exts[_len-1] != '\0') + if (_len > 0 && (new_exts[_len-1] != '\0')) _len += strlcpy(new_exts + _len, "|", sizeof(new_exts) - _len); _len += strlcpy(new_exts + _len, "jpg", sizeof(new_exts) - _len); #endif #ifdef HAVE_RTGA - if (new_exts[_len-1] != '\0') + if (_len > 0 && (new_exts[_len-1] != '\0')) _len += strlcpy(new_exts + _len, "|", sizeof(new_exts) - _len); _len += strlcpy(new_exts + _len, "tga", sizeof(new_exts) - _len); #endif diff --git a/menu/menu_driver.c b/menu/menu_driver.c index 7cc5a68fc73..b86445a6d58 100644 --- a/menu/menu_driver.c +++ b/menu/menu_driver.c @@ -1534,7 +1534,7 @@ static bool menu_input_key_bind_poll_find_hold_pad( if (!found) continue; - output->key = b; + output->key = (enum retro_key)b; return true; } @@ -1650,7 +1650,7 @@ static bool menu_input_key_bind_poll_find_trigger_pad( if (!found) continue; - output->key = b; + output->key = (enum retro_key)b; return true; } diff --git a/menu/menu_setting.c b/menu/menu_setting.c index a92f2bca800..1d527e7dc70 100644 --- a/menu/menu_setting.c +++ b/menu/menu_setting.c @@ -9059,6 +9059,16 @@ static void general_write_handler(rarch_setting_t *setting) video_driver_is_threaded()); } break; +#if HAVE_CLOUDSYNC + case MENU_ENUM_LABEL_CLOUD_SYNC_DRIVER: + { + struct menu_state *menu_st = menu_state_get_ptr(); + menu_st->flags |= MENU_ST_FLAG_PREVENT_POPULATE + | MENU_ST_FLAG_ENTRIES_NEED_REFRESH; + task_push_cloud_sync_update_driver(); + } + break; +#endif default: /* Special cases */ diff --git a/midi/drivers/winmm_midi.c b/midi/drivers/winmm_midi.c index b7ae7f256e6..0d4dbba6a02 100644 --- a/midi/drivers/winmm_midi.c +++ b/midi/drivers/winmm_midi.c @@ -321,7 +321,7 @@ static bool winmm_midi_write_short_event(winmm_midi_buffer_t *buf, buf->data[i++] = delta_time; buf->data[i++] = 0; - buf->data[i] = MEVT_F_SHORT << 24; + buf->data[i] = MEVT_F_SHORT; if (data_size == 0) buf->data[i] |= MEVT_NOP; else @@ -343,13 +343,16 @@ static bool winmm_midi_write_long_event(winmm_midi_buffer_t *buf, { DWORD i = buf->header.dwBytesRecorded / sizeof(DWORD); + /* data size has to be DWORD aligned */ + data_size = (data_size + (sizeof(DWORD) - 1)) & ~(sizeof(DWORD) - 1); + if (buf->header.dwBytesRecorded + sizeof(DWORD) * 3 + data_size > sizeof(DWORD) * WINMM_MIDI_BUF_LEN) return false; buf->data[i++] = delta_time; buf->data[i++] = 0; - buf->data[i++] = MEVT_F_LONG << 24 | MEVT_LONGMSG << 24 | data_size; + buf->data[i++] = MEVT_F_LONG | MEVT_LONGMSG << 24 | data_size; memcpy(&buf->data[i], data, data_size); buf->header.dwBytesRecorded += sizeof(DWORD) * 3 + data_size; diff --git a/msg_hash.h b/msg_hash.h index b38471c158c..d6486beda21 100644 --- a/msg_hash.h +++ b/msg_hash.h @@ -437,6 +437,8 @@ enum msg_hash_enums MSG_LEADERBOARD_STARTED, MSG_LEADERBOARD_FAILED, MSG_LEADERBOARD_SUBMISSION, + MSG_LEADERBOARD_RANK, + MSG_LEADERBOARD_BEST, MSG_CHANGE_THUMBNAIL_TYPE, MSG_TOGGLE_FULLSCREEN_THUMBNAILS, MSG_TOGGLE_CONTENT_METADATA, diff --git a/network/cloud_sync/icloud.m b/network/cloud_sync/icloud.m new file mode 100644 index 00000000000..56da738543e --- /dev/null +++ b/network/cloud_sync/icloud.m @@ -0,0 +1,184 @@ +/* RetroArch - A frontend for libretro. + * + * RetroArch is free software: you can redistribute it and/or modify it under the terms + * of the GNU General Public License as published by the Free Software Found- + * ation, either version 3 of the License, or (at your option) any later version. + * + * RetroArch is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; + * without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR + * PURPOSE. See the GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License along with RetroArch. + * If not, see . + */ + +#import + +#include "../cloud_sync_driver.h" +#include "../../verbosity.h" + +#define IC_RECORD_TYPE @"cloudsync" + +static bool icloud_sync_begin(cloud_sync_complete_handler_t cb, void *user_data) +{ + [CKContainer.defaultContainer accountStatusWithCompletionHandler:^(CKAccountStatus accountStatus, NSError * _Nullable error) { + BOOL success = (error == nil) && (accountStatus == CKAccountStatusAvailable); + cb(user_data, NULL, success, NULL); + }]; + return true; +} + +static bool icloud_sync_end(cloud_sync_complete_handler_t cb, void *user_data) +{ + cb(user_data, NULL, true, NULL); + return true; +} + +static CKRecord *icloud_remove_duplicates(NSArray *results) +{ + if (!results || ![results count]) + return nil; + if ([results count] == 1) + return results[0]; + + CKRecord *newest = nil; + for (CKRecord *rec in results) + { + CKRecord *toDelete = rec; + if (newest == nil || [newest.modificationDate compare:rec.modificationDate] == NSOrderedAscending) + { + toDelete = newest; + newest = rec; + } + if (toDelete) + { + [CKContainer.defaultContainer.privateCloudDatabase deleteRecordWithID:toDelete.recordID + completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) { + RARCH_DBG("[iCloud] delete callback for duplicate of %s %s\n", toDelete[@"path"], error == nil ? "succeeded" : "failed"); + }]; + } + } + return newest; +} + +static void icloud_query_path(const char *path, void(^cb)(CKRecord * results, NSError * error)) +{ + NSPredicate *pred = [NSComparisonPredicate + predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"path"] + rightExpression:[NSExpression expressionForConstantValue:[NSString stringWithUTF8String:path]] + modifier:NSDirectPredicateModifier + type:NSEqualToPredicateOperatorType + options:0]; + CKQuery *query = [[CKQuery alloc] initWithRecordType:IC_RECORD_TYPE predicate:pred]; + [CKContainer.defaultContainer.privateCloudDatabase performQuery:query + inZoneWithID:nil + completionHandler:^(NSArray * _Nullable results, NSError * _Nullable error) { + if (error || ![results count]) + { + RARCH_DBG("[iCloud] could not find %s (%s)\n", path, error == nil ? "successfully" : "failure"); + if (error) + RARCH_DBG("[iCloud] error: %s\n", [[error debugDescription] UTF8String]); + cb(nil, nil); + } + else + { + RARCH_DBG("[iCloud] found %d results looking for %s\n", [results count], path); + cb(icloud_remove_duplicates(results), nil); + } + }]; +} + +static bool icloud_read(const char *path, const char *file, cloud_sync_complete_handler_t cb, void *user_data) +{ + icloud_query_path(path, ^(CKRecord *result, NSError *error) { + if (result) + { + [CKContainer.defaultContainer.privateCloudDatabase fetchRecordWithID:result.recordID + completionHandler:^(CKRecord * _Nullable fetchedRecord, NSError * _Nullable error) { + if (error) + { + RARCH_DBG("[iCloud] failed to fetch record for %s\n", path); + cb(user_data, path, false, NULL); + } + else + { + CKAsset *asset = fetchedRecord[@"data"]; + NSData *data = [NSFileManager.defaultManager contentsAtPath:asset.fileURL.path]; + RARCH_DBG("[iCloud] successfully fetched %s, size %d\n", path, [data length]); + RFILE *rfile = filestream_open(file, + RETRO_VFS_FILE_ACCESS_READ_WRITE, + RETRO_VFS_FILE_ACCESS_HINT_NONE); + if (rfile) + { + filestream_truncate(rfile, 0); + filestream_write(rfile, [data bytes], [data length]); + filestream_seek(rfile, 0, SEEK_SET); + } + cb(user_data, path, true, rfile); + } + }]; + } + else + cb(user_data, path, error == nil, NULL); + }); + return true; +} + +static bool icloud_update(const char *path, RFILE *rfile, cloud_sync_complete_handler_t cb, void *user_data) +{ + icloud_query_path(path, ^(CKRecord *record, NSError *error) { + bool update = true; + if (error || !record) + { + record = [[CKRecord alloc] initWithRecordType:IC_RECORD_TYPE]; + record[@"path"] = [NSString stringWithUTF8String:path]; + update = false; + } + NSString *fileStr = [NSString stringWithUTF8String:filestream_get_path(rfile)]; + NSURL *fileURL = [NSURL fileURLWithPath:fileStr]; + record[@"data"] = [[CKAsset alloc] initWithFileURL:fileURL]; + [CKContainer.defaultContainer.privateCloudDatabase saveRecord:record completionHandler:^(CKRecord * _Nullable newrecord, NSError * _Nullable error) { + RARCH_DBG("[iCloud] %s %s %s\n", error == nil ? "succeeded" : "failed", update ? "updating" : "creating", path); + if (error) + RARCH_DBG("[iCloud] error: %s\n", [[error debugDescription] UTF8String]); + cb(user_data, path, error == nil, rfile); + }]; + }); + return true; +} + +static bool icloud_delete(const char *path, cloud_sync_complete_handler_t cb, void *user_data) +{ + NSPredicate *pred = [NSComparisonPredicate + predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"path"] + rightExpression:[NSExpression expressionForConstantValue:[NSString stringWithUTF8String:path]] + modifier:NSDirectPredicateModifier + type:NSEqualToPredicateOperatorType + options:0]; + CKQuery *query = [[CKQuery alloc] initWithRecordType:IC_RECORD_TYPE predicate:pred]; + [CKContainer.defaultContainer.privateCloudDatabase performQuery:query + inZoneWithID:nil + completionHandler:^(NSArray * _Nullable results, NSError * _Nullable error) { + RARCH_DBG("[iCloud] deleting %d records for %s\n", [results count], path); + for (CKRecord *record in results) + { + [CKContainer.defaultContainer.privateCloudDatabase deleteRecordWithID:record.recordID + completionHandler:^(CKRecordID * _Nullable recordID, NSError * _Nullable error) { + RARCH_DBG("[iCloud] delete callback for %s %s\n", path, error == nil ? "succeeded" : "failed"); + if (error) + RARCH_DBG("[iCloud] error: %s\n", [[error debugDescription] UTF8String]); + }]; + } + cb(user_data, path, error == nil, NULL); + }]; + return true; +} + +cloud_sync_driver_t cloud_sync_icloud = { + icloud_sync_begin, + icloud_sync_end, + icloud_read, + icloud_update, + icloud_delete, + "icloud" /* ident */ +}; diff --git a/network/cloud_sync_driver.c b/network/cloud_sync_driver.c index 6c98a017ada..e722533c51c 100644 --- a/network/cloud_sync_driver.c +++ b/network/cloud_sync_driver.c @@ -22,12 +22,15 @@ static cloud_sync_driver_t cloud_sync_null = { NULL, /* sync_end */ NULL, /* read */ NULL, /* update */ - NULL, /* delete */ + NULL, /* free */ "null" /* ident */ }; const cloud_sync_driver_t *cloud_sync_drivers[] = { &cloud_sync_webdav, +#ifdef HAVE_ICLOUD + &cloud_sync_icloud, +#endif &cloud_sync_null, NULL }; @@ -117,10 +120,10 @@ bool cloud_sync_update(const char *path, RFILE *file, return false; } -bool cloud_sync_delete(const char *path, cloud_sync_complete_handler_t cb, void *user_data) +bool cloud_sync_free(const char *path, cloud_sync_complete_handler_t cb, void *user_data) { const cloud_sync_driver_t *driver = cloud_sync_state_get_ptr()->driver; - if (driver && driver->delete) - return driver->delete(path, cb, user_data); + if (driver && driver->free) + return driver->free(path, cb, user_data); return false; } diff --git a/network/cloud_sync_driver.h b/network/cloud_sync_driver.h index c4f56504b8c..f834a5f8c4e 100644 --- a/network/cloud_sync_driver.h +++ b/network/cloud_sync_driver.h @@ -38,7 +38,7 @@ typedef struct cloud_sync_driver bool (*read)(const char *path, const char *file, cloud_sync_complete_handler_t cb, void *user_data); bool (*update)(const char *path, RFILE *file, cloud_sync_complete_handler_t cb, void *user_data); - bool (*delete)(const char *path, cloud_sync_complete_handler_t cb, void *user_data); + bool (*free)(const char *path, cloud_sync_complete_handler_t cb, void *user_data); const char *ident; } cloud_sync_driver_t; @@ -51,6 +51,9 @@ typedef struct cloud_sync_driver_state_t *cloud_sync_state_get_ptr(void); extern cloud_sync_driver_t cloud_sync_webdav; +#ifdef HAVE_ICLOUD +extern cloud_sync_driver_t cloud_sync_icloud; +#endif extern const cloud_sync_driver_t *cloud_sync_drivers[]; @@ -70,7 +73,7 @@ bool cloud_sync_end(cloud_sync_complete_handler_t cb, void *user_data); bool cloud_sync_read(const char *path, const char *file, cloud_sync_complete_handler_t cb, void *user_data); bool cloud_sync_update(const char *path, RFILE *file, cloud_sync_complete_handler_t cb, void *user_data); -bool cloud_sync_delete(const char *path, cloud_sync_complete_handler_t cb, void *user_data); +bool cloud_sync_free(const char *path, cloud_sync_complete_handler_t cb, void *user_data); RETRO_END_DECLS diff --git a/pkg/android/phoenix/AndroidManifest.xml b/pkg/android/phoenix/AndroidManifest.xml index 2d978a820d7..16c235a30be 100644 --- a/pkg/android/phoenix/AndroidManifest.xml +++ b/pkg/android/phoenix/AndroidManifest.xml @@ -10,6 +10,8 @@ + + @@ -23,10 +25,8 @@ android:isGame="true" android:banner="@drawable/banner" android:extractNativeLibs="true" + android:requestLegacyExternalStorage="true" tools:ignore="UnusedAttribute"> - diff --git a/pkg/android/phoenix/res/values/strings.xml b/pkg/android/phoenix/res/values/strings.xml deleted file mode 100644 index c8e55b6caf3..00000000000 --- a/pkg/android/phoenix/res/values/strings.xml +++ /dev/null @@ -1,31 +0,0 @@ - - - - Migrate RetroArch Folder - - - Because RetroArch was updated, the location of the RetroArch folder has changed. \n - Would you like to import data from an existing RetroArch folder? - - - Yes, select existing RetroArch folder - - - No, don\'t ask again - - - No, ask next time - - - Copying RetroArch Files… - - - Your RetroArch folder has been migrated. \n - You can find it in the files app under RetroArch > User Data. - - - Your RetroArch folder has been migrated. \n - You can find it in the files app under RetroArch > User Data. \n - There were errors copying some files. - - diff --git a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java index cc3f37636df..7a7117c9017 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MainMenuActivity.java @@ -12,14 +12,106 @@ import android.preference.PreferenceManager; import android.provider.Settings; +import java.util.List; +import java.util.ArrayList; +import android.content.pm.PackageManager; +import android.Manifest; +import android.content.DialogInterface; +import android.app.AlertDialog; +import android.util.Log; + /** * {@link PreferenceActivity} subclass that provides all of the * functionality of the main menu screen. */ public final class MainMenuActivity extends PreferenceActivity { + final private int REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS = 124; public static String PACKAGE_NAME; - final int REQUEST_CODE_START = 120; + boolean checkPermissions = false; + + public void showMessageOKCancel(String message, DialogInterface.OnClickListener onClickListener) + { + new AlertDialog.Builder(this).setMessage(message) + .setPositiveButton("OK", onClickListener).setCancelable(false) + .setNegativeButton("Cancel", null).create().show(); + } + + private boolean addPermission(List permissionsList, String permission) + { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) + { + if (checkSelfPermission(permission) != PackageManager.PERMISSION_GRANTED) + { + permissionsList.add(permission); + + // Check for Rationale Option + if (!shouldShowRequestPermissionRationale(permission)) + return false; + } + } + + return true; + } + + public void checkRuntimePermissions() + { + if (android.os.Build.VERSION.SDK_INT >= android.os.Build.VERSION_CODES.M) + { + // Android 6.0+ needs runtime permission checks + List permissionsNeeded = new ArrayList(); + final List permissionsList = new ArrayList(); + + if (!addPermission(permissionsList, Manifest.permission.READ_EXTERNAL_STORAGE)) + permissionsNeeded.add("Read External Storage"); + if (!addPermission(permissionsList, Manifest.permission.WRITE_EXTERNAL_STORAGE)) + permissionsNeeded.add("Write External Storage"); + + if (permissionsList.size() > 0) + { + checkPermissions = true; + + if (permissionsNeeded.size() > 0) + { + // Need Rationale + Log.i("MainMenuActivity", "Need to request external storage permissions."); + + String message = "You need to grant access to " + permissionsNeeded.get(0); + + for (int i = 1; i < permissionsNeeded.size(); i++) + message = message + ", " + permissionsNeeded.get(i); + + showMessageOKCancel(message, + new DialogInterface.OnClickListener() + { + @Override + public void onClick(DialogInterface dialog, int which) + { + if (which == AlertDialog.BUTTON_POSITIVE) + { + requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), + REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); + + Log.i("MainMenuActivity", "User accepted request for external storage permissions."); + } + } + }); + } + else + { + requestPermissions(permissionsList.toArray(new String[permissionsList.size()]), + REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS); + + Log.i("MainMenuActivity", "Requested external storage permissions."); + } + } + } + + if (!checkPermissions) + { + finalStartup(); + } + } public void finalStartup() { @@ -40,6 +132,33 @@ public void finalStartup() finish(); } + @Override + public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) + { + switch (requestCode) + { + case REQUEST_CODE_ASK_MULTIPLE_PERMISSIONS: + for (int i = 0; i < permissions.length; i++) + { + if(grantResults[i] == PackageManager.PERMISSION_GRANTED) + { + Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was granted."); + } + else + { + Log.i("MainMenuActivity", "Permission: " + permissions[i] + " was not granted."); + } + } + + break; + default: + super.onRequestPermissionsResult(requestCode, permissions, grantResults); + break; + } + + finalStartup(); + } + public static void startRetroActivity(Intent retro, String contentPath, String corePath, String configFilePath, String imePath, String dataDirPath, String dataSourcePath) { @@ -51,19 +170,11 @@ public static void startRetroActivity(Intent retro, String contentPath, String c retro.putExtra("IME", imePath); retro.putExtra("DATADIR", dataDirPath); retro.putExtra("APK", dataSourcePath); + retro.putExtra("SDCARD", Environment.getExternalStorageDirectory().getAbsolutePath()); String external = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + PACKAGE_NAME + "/files"; - retro.putExtra("SDCARD", external); retro.putExtra("EXTERNAL", external); } - @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) - { - if(requestCode == REQUEST_CODE_START) { - finalStartup(); - } - } - @Override public void onCreate(Bundle savedInstanceState) { @@ -76,7 +187,6 @@ public void onCreate(Bundle savedInstanceState) UserPreferences.updateConfigFile(this); - Intent i = new Intent(this, MigrateRetroarchFolderActivity.class); - startActivityForResult(i, REQUEST_CODE_START); + checkRuntimePermissions(); } } diff --git a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java b/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java deleted file mode 100644 index b02b6f6e102..00000000000 --- a/pkg/android/phoenix/src/com/retroarch/browser/mainmenu/MigrateRetroarchFolderActivity.java +++ /dev/null @@ -1,306 +0,0 @@ -package com.retroarch.browser.mainmenu; - -import android.annotation.TargetApi; -import android.app.Activity; -import android.app.AlertDialog; -import android.app.ProgressDialog; -import android.content.ContentResolver; -import android.content.DialogInterface; -import android.content.Intent; -import android.content.SharedPreferences; -import android.content.pm.PackageInfo; -import android.content.pm.PackageManager; -import android.database.Cursor; -import android.net.Uri; -import android.os.AsyncTask; -import android.os.Bundle; -import android.os.Environment; -import android.os.ParcelFileDescriptor; -import android.preference.PreferenceManager; -import android.provider.DocumentsContract; -import android.util.Log; -import android.util.Pair; - -import com.retroarch.R; - -import java.io.File; -import java.io.IOException; -import java.nio.charset.StandardCharsets; -import java.nio.file.Files; -import java.nio.file.Path; -import java.nio.file.Paths; -import java.nio.file.StandardCopyOption; -import java.nio.file.attribute.BasicFileAttributes; -import java.util.ArrayList; -import java.util.function.BiPredicate; -import java.util.function.Consumer; -import java.util.stream.Stream; - - -@TargetApi(26) -public class MigrateRetroarchFolderActivity extends Activity -{ - final int REQUEST_CODE_GET_OLD_RETROARCH_FOLDER = 125; - - @Override - public void onCreate(Bundle savedInstanceState) - { - super.onCreate(savedInstanceState); - - // Needs v26 for some of the file handling functions below. - // Remove the TargetApi annotation to see which. - // If we don't have it, then just skip migration. - if (android.os.Build.VERSION.SDK_INT < 26) { - finish(); - } - if(needToMigrate()){ - askToMigrate(); - }else{ - finish(); - } - } - - boolean needToMigrate() - { - // As the RetroArch folder has been moved from shared storage to app-specific storage, - // people upgrading from older versions using the old location will need to migrate their data. - // We identify these users by checking that the app has been updated from an older version, - // and that the older version did not use the new location. - final SharedPreferences prefs = PreferenceManager.getDefaultSharedPreferences(this); - boolean isNewInstall; - try{ - PackageInfo info = getPackageManager().getPackageInfo(getPackageName(), 0); - isNewInstall = info.firstInstallTime == info.lastUpdateTime; - }catch(PackageManager.NameNotFoundException ex) { - isNewInstall = true; - } - - // Avoid asking if new install - if(isNewInstall && !prefs.contains("external_retroarch_folder_needs_migrate")){ - SharedPreferences.Editor editor = prefs.edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.apply(); - } - - return prefs.getBoolean("external_retroarch_folder_needs_migrate", true); - } - - void askToMigrate() - { - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setCancelable(false); - builder.setTitle(R.string.migrate_retroarch_folder_dialog_title); - builder.setMessage(R.string.migrate_retroarch_folder_dialog_message); - builder.setNegativeButton(R.string.migrate_retroarch_folder_dialog_negative, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.apply(); - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.setNeutralButton(R.string.migrate_retroarch_folder_dialog_neutral, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(MigrateRetroarchFolderActivity.this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", true); - editor.apply(); - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.setPositiveButton(R.string.migrate_retroarch_folder_dialog_positive, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT_TREE); - intent.putExtra(DocumentsContract.EXTRA_INITIAL_URI, Uri.fromFile(new File( - Environment.getExternalStorageDirectory().getAbsolutePath() + "/RetroArch" - ))); - startActivityForResult(intent, REQUEST_CODE_GET_OLD_RETROARCH_FOLDER); - } - }); - AlertDialog dialog = builder.create(); - dialog.show(); - } - - public void onActivityResult(int requestCode, int resultCode, Intent resultData) - { - super.onActivityResult(requestCode, resultCode, resultData); - if(requestCode == REQUEST_CODE_GET_OLD_RETROARCH_FOLDER){ - if(resultCode == Activity.RESULT_OK && resultData != null){ - copyFiles(resultData.getData()); - }else{ - //User cancelled or otherwise failed. Go back to the picker screen. - askToMigrate(); - } - } - } - - void copyFiles(Uri sourceDir) - { - final ProgressDialog pd = new ProgressDialog(this); - pd.setMax(100); - pd.setTitle(R.string.migrate_retroarch_folder_inprogress); - pd.setProgressStyle(ProgressDialog.STYLE_SPINNER); - pd.setCancelable(false); - - CopyThread thread = new CopyThread() - { - @Override - protected void onPreExecute(){ - super.onPreExecute(); - pd.show(); - } - @Override - protected void onProgressUpdate(String... params) - { - super.onProgressUpdate(params); - pd.setMessage(params[0]); - } - @Override - protected void onPostExecute(Boolean ok) - { - super.onPostExecute(ok); - pd.dismiss(); - postMigrate(ok); - } - }; - - thread.execute(sourceDir); - } - - void postMigrate(boolean ok) - { - SharedPreferences.Editor editor = PreferenceManager.getDefaultSharedPreferences(this).edit(); - editor.putBoolean("external_retroarch_folder_needs_migrate", false); - editor.apply(); - - AlertDialog.Builder builder = new AlertDialog.Builder(this); - builder.setMessage(ok ? - R.string.migrate_retroarch_folder_confirm : - R.string.migrate_retroarch_folder_confirm_witherror - ); - builder.setPositiveButton(android.R.string.ok, new DialogInterface.OnClickListener() { - @Override public void onClick(DialogInterface dialogInterface, int i) { - MigrateRetroarchFolderActivity.this.finish(); - } - }); - builder.create().show(); - } - - class CopyThread extends AsyncTask - { - ContentResolver resolver; - boolean error; - @Override - protected void onPreExecute() - { - resolver = MigrateRetroarchFolderActivity.this.getContentResolver(); - error = false; - } - @Override - protected Boolean doInBackground(Uri... params) - { - Uri source = params[0]; - error = false; - String destination = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MigrateRetroarchFolderActivity.this.getPackageName() + "/files/RetroArch"; - copyFolder(source, new File(destination)); - patchConfig(); - return !error; - } - void copyFolder(Uri sourceUri, File dest) - { - //create destination folder - if(!(dest.isDirectory() || dest.mkdirs())) { - Log.e("MigrateRetroarchFolder", "Couldn't make new destination folder " + dest.getPath()); - error = true; - return; - } - - Uri sourceChildrenResolver; - try{ //for subfolders - sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getDocumentId(sourceUri)); - }catch(IllegalArgumentException ex){ //for root selected by document picker - sourceChildrenResolver = DocumentsContract.buildChildDocumentsUriUsingTree(sourceUri, DocumentsContract.getTreeDocumentId(sourceUri)); - } - try( - //list children of directory - Cursor c = resolver.query(sourceChildrenResolver, new String[]{DocumentsContract.Document.COLUMN_DOCUMENT_ID, DocumentsContract.Document.COLUMN_DISPLAY_NAME, DocumentsContract.Document.COLUMN_MIME_TYPE}, null, null, null) - ) { - if(c == null) { - Log.e("MigrateRetroarchFolder", "Could not list files in source folder " + sourceUri.toString()); - error = true; - return; - } - while(c.moveToNext()){ //loop through children returned - String childFilename = c.getString(1); - Uri childUri = DocumentsContract.buildDocumentUriUsingTree(sourceUri, c.getString(0)); - String childDocumentId = DocumentsContract.getDocumentId(childUri); - File destFile = new File(dest, childFilename); - - if(c.getString(2).equals(DocumentsContract.Document.MIME_TYPE_DIR)){ //is a folder, recurse - copyFolder(childUri, destFile); - }else{ //is a file, copy it - try( - ParcelFileDescriptor pfd = resolver.openFileDescriptor(childUri, "r"); - ParcelFileDescriptor.AutoCloseInputStream sourceStream = new ParcelFileDescriptor.AutoCloseInputStream(pfd); - ) { - Files.copy(sourceStream, destFile.toPath(), StandardCopyOption.REPLACE_EXISTING); - }catch(Exception ex){ - Log.e("MigrateRetroarchFolder", "Error copying file " + childDocumentId, ex); - error = true; - } - } - publishProgress(destFile.toString()); - } - }catch(Exception ex){ - Log.e("MigrateRetroarchFolder", "Error while copying", ex); - error = true; - } - } - void patchConfig(){ - String appDir = Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + MigrateRetroarchFolderActivity.this.getPackageName() + "/files"; - String legacyDefaultRetroarchPath = Environment.getExternalStorageDirectory().getAbsolutePath() + "/RetroArch"; - String migratedRetroarchPath = appDir + "/RetroArch"; - - final ArrayList files = new ArrayList<>(); - try ( - Stream s = Files.find(Paths.get(appDir), 30, new BiPredicate() { - @Override - public boolean test(Path path, BasicFileAttributes basicFileAttributes) { - String p = path.toString(); - return p.endsWith(".lpl") || p.endsWith(".cfg"); - } - }) - ){ - // yes it's a roudabout way to gather it in a list, but Stream.collect is throwing type errors - s.forEach(new Consumer() { - @Override - public void accept(Path path) { - files.add(path); - } - }); - }catch(IOException ex){ - Log.e("MigrateRetroarchFolder", "Error searching for config files", ex); - error = true; - return; - } - - for(Path file : files){ - try{ - //back up before patching - Path backupFile = file.resolveSibling(file.getFileName() + ".old"); - Files.copy(file, backupFile, StandardCopyOption.REPLACE_EXISTING); - - //replace old retroarch prefix with new path - //assumes default old path, doesn't help if user has relocated it - //not doing any syntactical analysis because the search string is pretty long and unique - String contents = new String(Files.readAllBytes(file)); - String replaced = contents.replace(legacyDefaultRetroarchPath, migratedRetroarchPath); - Files.write(file, replaced.getBytes(StandardCharsets.UTF_8)); - }catch(IOException ex){ - Log.e("MigrateRetroarchFolder", "Error patching file " + file.toAbsolutePath(), ex); - error = true; - return; - } - } - } - } -} diff --git a/pkg/android/phoenix/src/com/retroarch/browser/provider/RetroDocumentsProvider.java b/pkg/android/phoenix/src/com/retroarch/browser/provider/RetroDocumentsProvider.java index 52bd33a058e..c49a7432ffd 100644 --- a/pkg/android/phoenix/src/com/retroarch/browser/provider/RetroDocumentsProvider.java +++ b/pkg/android/phoenix/src/com/retroarch/browser/provider/RetroDocumentsProvider.java @@ -10,9 +10,7 @@ import android.graphics.Point; import android.os.Build; import android.os.CancellationSignal; -import android.os.Environment; import android.os.ParcelFileDescriptor; -import android.provider.DocumentsContract; import android.provider.DocumentsContract.Document; import android.provider.DocumentsContract.Root; import android.provider.DocumentsProvider; @@ -37,13 +35,11 @@ * offering two different ways of accessing your stored data. This would be confusing for users." * - http://developer.android.com/guide/topics/providers/document-provider.html#43 */ -@TargetApi(Build.VERSION_CODES.LOLLIPOP) +@TargetApi(Build.VERSION_CODES.KITKAT) public class RetroDocumentsProvider extends DocumentsProvider { private static final String ALL_MIME_TYPES = "*/*"; - private String DOCUMENTS_AUTHORITY; - // The default columns to return information about a root if no specific // columns are requested in a query. private static final String[] DEFAULT_ROOT_PROJECTION = new String[]{ @@ -70,31 +66,19 @@ public class RetroDocumentsProvider extends DocumentsProvider { @Override public Cursor queryRoots(String[] projection) throws FileNotFoundException { + final File BASE_DIR = new File(getContext().getFilesDir().getParent()); final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_ROOT_PROJECTION); @SuppressWarnings("ConstantConditions") final String applicationName = getContext().getString(R.string.app_name); - final File CORE_DIR = new File(getContext().getFilesDir().getParent()); - final MatrixCursor.RowBuilder core = result.newRow(); - core.add(Root.COLUMN_ROOT_ID, getDocIdForFile(CORE_DIR)); - core.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(CORE_DIR)); - core.add(Root.COLUMN_SUMMARY, "Core Data"); - core.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD); - core.add(Root.COLUMN_TITLE, applicationName); - core.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES); - core.add(Root.COLUMN_AVAILABLE_BYTES, CORE_DIR.getFreeSpace()); - core.add(Root.COLUMN_ICON, R.mipmap.ic_launcher); - - final File USER_DIR = new File(Environment.getExternalStorageDirectory().getAbsolutePath() + "/Android/data/" + getContext().getPackageName() + "/files/RetroArch"); - final MatrixCursor.RowBuilder user = result.newRow(); - user.add(Root.COLUMN_ROOT_ID, getDocIdForFile(USER_DIR)); - user.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(USER_DIR)); - user.add(Root.COLUMN_SUMMARY, "User Data"); - user.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD); - user.add(Root.COLUMN_TITLE, applicationName); - user.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES); - user.add(Root.COLUMN_AVAILABLE_BYTES, USER_DIR.getFreeSpace()); - user.add(Root.COLUMN_ICON, R.mipmap.ic_launcher); - + final MatrixCursor.RowBuilder row = result.newRow(); + row.add(Root.COLUMN_ROOT_ID, getDocIdForFile(BASE_DIR)); + row.add(Root.COLUMN_DOCUMENT_ID, getDocIdForFile(BASE_DIR)); + row.add(Root.COLUMN_SUMMARY, null); + row.add(Root.COLUMN_FLAGS, Root.FLAG_SUPPORTS_CREATE | Root.FLAG_SUPPORTS_SEARCH | Root.FLAG_SUPPORTS_IS_CHILD); + row.add(Root.COLUMN_TITLE, applicationName); + row.add(Root.COLUMN_MIME_TYPES, ALL_MIME_TYPES); + row.add(Root.COLUMN_AVAILABLE_BYTES, BASE_DIR.getFreeSpace()); + row.add(Root.COLUMN_ICON, R.mipmap.ic_launcher); return result; } @@ -105,36 +89,6 @@ public Cursor queryDocument(String documentId, String[] projection) throws FileN return result; } - @Override - public String moveDocument(String sourceDocumentId, String sourceParentDocumentId, String targetParentDocumentId) throws FileNotFoundException { - File sourceFile = getFileForDocId(sourceDocumentId); - File targetParentFile = getFileForDocId(targetParentDocumentId); - File destination = new File(targetParentFile, sourceFile.getName()); - - boolean success = sourceFile.renameTo(destination); - if(!success){ - throw new FileNotFoundException("Failed to move file " + sourceDocumentId + " to " + targetParentDocumentId); - } - - getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, sourceParentDocumentId), null); - getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, targetParentDocumentId), null); - return getDocIdForFile(destination); - } - - @Override - public String renameDocument(String documentId, String displayName) throws FileNotFoundException{ - File document = getFileForDocId(documentId); - File destination = new File(document.getParentFile(), displayName); - - boolean success = document.renameTo(destination); - if(!success){ - throw new FileNotFoundException("Failed to rename file " + documentId + " to " + displayName); - } - - getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, getDocIdForFile(document.getParentFile())), null); - return getDocIdForFile(destination); - } - @Override public Cursor queryChildDocuments(String parentDocumentId, String[] projection, String sortOrder) throws FileNotFoundException { final MatrixCursor result = new MatrixCursor(projection != null ? projection : DEFAULT_DOCUMENT_PROJECTION); @@ -142,7 +96,6 @@ public Cursor queryChildDocuments(String parentDocumentId, String[] projection, for (File file : parent.listFiles()) { includeFile(result, null, file); } - result.setNotificationUri(getContext().getContentResolver(), DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, parentDocumentId)); return result; } @@ -162,7 +115,6 @@ public AssetFileDescriptor openDocumentThumbnail(String documentId, Point sizeHi @Override public boolean onCreate() { - DOCUMENTS_AUTHORITY = getContext().getPackageName() + ".documents"; return true; } @@ -186,25 +138,14 @@ public String createDocument(String parentDocumentId, String mimeType, String di } catch (IOException e) { throw new FileNotFoundException("Failed to create document with id " + newFile.getPath()); } - getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, parentDocumentId), null); return newFile.getPath(); } @Override public void deleteDocument(String documentId) throws FileNotFoundException { File file = getFileForDocId(documentId); - rm_r(file); - getContext().getContentResolver().notifyChange(DocumentsContract.buildTreeDocumentUri(DOCUMENTS_AUTHORITY, getDocIdForFile(file.getParentFile())), null); - } - - void rm_r (File file) throws FileNotFoundException{ - if(file.isDirectory()){ - for(File child : file.listFiles()) { - rm_r(child); - } - } - if(!file.delete()){ - throw new FileNotFoundException("Could not delete file " + file.getPath()); + if (!file.delete()) { + throw new FileNotFoundException("Failed to delete document with id " + documentId); } } @@ -307,11 +248,11 @@ private void includeFile(MatrixCursor result, String docId, File file) int flags = 0; if (file.isDirectory()) { - if (file.canWrite()) flags |= Document.FLAG_DIR_SUPPORTS_CREATE | Document.FLAG_SUPPORTS_RENAME; - } else { - if (file.canWrite()) flags |= Document.FLAG_SUPPORTS_WRITE | Document.FLAG_SUPPORTS_RENAME; + if (file.canWrite()) flags |= Document.FLAG_DIR_SUPPORTS_CREATE; + } else if (file.canWrite()) { + flags |= Document.FLAG_SUPPORTS_WRITE; } - if (file.getParentFile().canWrite()) flags |= Document.FLAG_SUPPORTS_DELETE | Document.FLAG_SUPPORTS_MOVE; + if (file.getParentFile().canWrite()) flags |= Document.FLAG_SUPPORTS_DELETE; final String displayName = file.getName(); final String mimeType = getMimeType(file); diff --git a/pkg/apple/AppStore.xcconfig b/pkg/apple/AppStore.xcconfig index 69c5bb9a84c..86d07ae84c2 100644 --- a/pkg/apple/AppStore.xcconfig +++ b/pkg/apple/AppStore.xcconfig @@ -8,3 +8,5 @@ INFOPLIST_FILE = $(SRCROOT)/OSX/Info_AppStore.plist DEVELOPMENT_TEAM=UK699V5ZS8 OTHER_CFLAGS = $(inherited) -DHAVE_APPLE_STORE +OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD +CODE_SIGN_ENTITLEMENTS = RetroArchAppStore.entitlements diff --git a/pkg/apple/GitLabCI.xcconfig b/pkg/apple/GitLabCI.xcconfig index 28f9362eb13..5d7c39ea4ac 100644 --- a/pkg/apple/GitLabCI.xcconfig +++ b/pkg/apple/GitLabCI.xcconfig @@ -9,3 +9,5 @@ #include "Metal.xcconfig" DEVELOPMENT_TEAM=UK699V5ZS8 +OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD +CODE_SIGN_ENTITLEMENTS = RetroArchCI.entitlements diff --git a/pkg/apple/OSX/Info_Metal.plist b/pkg/apple/OSX/Info_Metal.plist index 9d16941b730..b76ebf588b2 100644 --- a/pkg/apple/OSX/Info_Metal.plist +++ b/pkg/apple/OSX/Info_Metal.plist @@ -1653,7 +1653,6 @@ - UTTypeConformsTo diff --git a/pkg/apple/RetroArchAppStore.entitlements b/pkg/apple/RetroArchAppStore.entitlements index 37af9c08a7f..f184eb63ccd 100644 --- a/pkg/apple/RetroArchAppStore.entitlements +++ b/pkg/apple/RetroArchAppStore.entitlements @@ -2,6 +2,16 @@ + com.apple.developer.aps-environment + production + com.apple.developer.icloud-container-identifiers + + iCloud.com.libretro.dist.RetroArch + + com.apple.developer.icloud-services + + CloudKit + com.apple.security.app-sandbox com.apple.security.cs.allow-dyld-environment-variables diff --git a/pkg/apple/RetroArchCI.entitlements b/pkg/apple/RetroArchCI.entitlements new file mode 100644 index 00000000000..7068d0cba3b --- /dev/null +++ b/pkg/apple/RetroArchCI.entitlements @@ -0,0 +1,22 @@ + + + + + com.apple.developer.aps-environment + production + com.apple.developer.icloud-container-identifiers + + iCloud.com.libretro.dist.RetroArch + + com.apple.developer.icloud-services + + CloudKit + + com.apple.security.cs.allow-dyld-environment-variables + + com.apple.security.cs.disable-executable-page-protection + + com.apple.security.cs.disable-library-validation + + + diff --git a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj index cf1a7e74050..1a4743facdb 100644 --- a/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_Metal.xcodeproj/project.pbxproj @@ -65,6 +65,7 @@ 0720995929B1258C001642BB /* IOKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 84DD5EB41A89E737007336C1 /* IOKit.framework */; }; 072976DD296284F600D6E00C /* OpenGL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 072976DC296284F600D6E00C /* OpenGL.framework */; }; 0746953A2997393000CCB7BD /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 074695362995C03900CCB7BD /* GameController.framework */; }; + 075650252C488918004C5E7E /* CloudKit.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 075650242C488918004C5E7E /* CloudKit.framework */; }; 076E640C2BF30A7A00681536 /* CoreHaptics.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 0795A8C6299A095300D5035D /* CoreHaptics.framework */; }; 076E640D2BF30A9200681536 /* GameController.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 074695362995C03900CCB7BD /* GameController.framework */; }; 076E640E2BF30AA200681536 /* OpenAL.framework in Frameworks */ = {isa = PBXBuildFile; fileRef = 070A883F2A4E7A1B003161C0 /* OpenAL.framework */; }; @@ -563,6 +564,8 @@ 0720996029B1258C001642BB /* RetroArch.app */ = {isa = PBXFileReference; explicitFileType = wrapper.application; includeInIndex = 0; path = RetroArch.app; sourceTree = BUILT_PRODUCTS_DIR; }; 072976DC296284F600D6E00C /* OpenGL.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = OpenGL.framework; path = System/Library/Frameworks/OpenGL.framework; sourceTree = SDKROOT; }; 074695362995C03900CCB7BD /* GameController.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = GameController.framework; path = System/Library/Frameworks/GameController.framework; sourceTree = SDKROOT; }; + 075650242C488918004C5E7E /* CloudKit.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CloudKit.framework; path = System/Library/Frameworks/CloudKit.framework; sourceTree = SDKROOT; }; + 075650262C48B417004C5E7E /* RetroArchCI.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RetroArchCI.entitlements; sourceTree = ""; }; 0776EF3829A005D600AF0237 /* Steam.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; path = Steam.xcconfig; sourceTree = ""; }; 0790F6782BF282B400AA58C9 /* Media.xcassets */ = {isa = PBXFileReference; lastKnownFileType = folder.assetcatalog; name = Media.xcassets; path = OSX/Media.xcassets; sourceTree = ""; }; 0795A8C6299A095300D5035D /* CoreHaptics.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = CoreHaptics.framework; path = System/Library/Frameworks/CoreHaptics.framework; sourceTree = SDKROOT; }; @@ -691,6 +694,7 @@ 0795A8C7299A095300D5035D /* CoreHaptics.framework in Frameworks */, 05A8E23820A63CB40084ABDA /* Metal.framework in Frameworks */, 05269A6220ABF20500C29F1E /* MetalKit.framework in Frameworks */, + 075650252C488918004C5E7E /* CloudKit.framework in Frameworks */, 5061C8A41AE47E510080AE14 /* libz.dylib in Frameworks */, 070A88402A4E7A1B003161C0 /* OpenAL.framework in Frameworks */, 07EF0FF92BEB117000EDCA9B /* MoltenVK.xcframework in Frameworks */, @@ -1466,6 +1470,7 @@ isa = PBXGroup; children = ( 07F8037C2BEFE4BD000FD557 /* RetroArchAppStore.entitlements */, + 075650262C48B417004C5E7E /* RetroArchCI.entitlements */, 686201AB24B823A800EBDD95 /* RetroArch.entitlements */, 05D7753120A55D2700646447 /* BaseConfig.xcconfig */, 05422E5C2140CFC500F09961 /* Metal.xcconfig */, @@ -1501,6 +1506,7 @@ 29B97323FDCFA39411CA2CEA /* Frameworks */ = { isa = PBXGroup; children = ( + 075650242C488918004C5E7E /* CloudKit.framework */, 07EF0FF42BEB114000EDCA9B /* MoltenVK.xcframework */, 070A883F2A4E7A1B003161C0 /* OpenAL.framework */, 0795A8C6299A095300D5035D /* CoreHaptics.framework */, @@ -2022,8 +2028,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = RetroArchAppStore.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 44; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment"; PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch; @@ -2037,8 +2041,6 @@ ASSETCATALOG_COMPILER_APPICON_NAME = AppIcon; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; CODE_SIGN_ENTITLEMENTS = RetroArchAppStore.entitlements; - CODE_SIGN_IDENTITY = "Apple Development"; - CODE_SIGN_STYLE = Automatic; CURRENT_PROJECT_VERSION = 44; INFOPLIST_KEY_LSApplicationCategoryType = "public.app-category.entertainment"; PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch; @@ -2088,8 +2090,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_ENTITLEMENTS = RetroArch.entitlements; - CODE_SIGN_IDENTITY = "Developer ID Application"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; COPY_PHASE_STRIP = NO; DEVELOPMENT_TEAM = UK699V5ZS8; @@ -2136,7 +2137,7 @@ MTL_ENABLE_DEBUG_INFO = INCLUDE_SOURCE; MTL_FAST_MATH = YES; ONLY_ACTIVE_ARCH = YES; - PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch; PRODUCT_NAME = RetroArch; RUN_CLANG_STATIC_ANALYZER = YES; SDKROOT = macosx; @@ -2169,8 +2170,7 @@ CLANG_WARN_UNREACHABLE_CODE = YES; CLANG_WARN__DUPLICATE_METHOD_MATCH = YES; CODE_SIGN_ENTITLEMENTS = RetroArch.entitlements; - CODE_SIGN_IDENTITY = "Developer ID Application"; - CODE_SIGN_STYLE = Manual; + CODE_SIGN_STYLE = Automatic; COMBINE_HIDPI_IMAGES = YES; DEBUG_INFORMATION_FORMAT = "dwarf-with-dsym"; DEVELOPMENT_TEAM = UK699V5ZS8; @@ -2218,7 +2218,7 @@ MTL_ENABLE_DEBUG_INFO = NO; MTL_FAST_MATH = YES; MTL_IGNORE_WARNINGS = YES; - PRODUCT_BUNDLE_IDENTIFIER = libretro.RetroArch; + PRODUCT_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch; PRODUCT_NAME = RetroArch; SDKROOT = macosx; STRIP_STYLE = debugging; diff --git a/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj index 26ea9fff136..c70132bf9a6 100644 --- a/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj +++ b/pkg/apple/RetroArch_iOS13.xcodeproj/project.pbxproj @@ -203,6 +203,7 @@ 0712A7772B807AE400C9765F /* Info.plist */ = {isa = PBXFileReference; lastKnownFileType = text.plist.xml; path = Info.plist; sourceTree = ""; }; 0718BC5F2ABBA807001F2CBE /* Network.framework */ = {isa = PBXFileReference; lastKnownFileType = wrapper.framework; name = Network.framework; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS17.0.sdk/System/Library/Frameworks/Network.framework; sourceTree = DEVELOPER_DIR; }; 073DB2892B8706490001BA32 /* RetroArchTV.entitlements */ = {isa = PBXFileReference; lastKnownFileType = text.plist.entitlements; path = RetroArchTV.entitlements; sourceTree = ""; }; + 076A9EAF2C438E1D00504BDF /* RetroArchiOS.entitlements */ = {isa = PBXFileReference; fileEncoding = 4; lastKnownFileType = text.plist.entitlements; name = RetroArchiOS.entitlements; path = iOS/RetroArchiOS.entitlements; sourceTree = SOURCE_ROOT; }; 076CA50C2B695C2C00840EA5 /* libz.tbd */ = {isa = PBXFileReference; lastKnownFileType = "sourcecode.text-based-dylib-definition"; name = libz.tbd; path = Platforms/AppleTVOS.platform/Developer/SDKs/AppleTVOS17.2.sdk/usr/lib/libz.tbd; sourceTree = DEVELOPER_DIR; }; 077AB2C82BFB0E28002BBE2F /* AppStore.xcconfig */ = {isa = PBXFileReference; lastKnownFileType = text.xcconfig; name = AppStore.xcconfig; path = iOS/AppStore.xcconfig; sourceTree = ""; }; 0789FC2E2A07845300D042B7 /* AltKit */ = {isa = PBXFileReference; lastKnownFileType = wrapper; name = AltKit; path = Frameworks/AltKit; sourceTree = ""; }; @@ -582,6 +583,7 @@ 9222F20A2315DD3D0097C0FD /* retroarch_logo.png */, 83EB675F19EEAF050096F441 /* iOS/modules */, 69D31DE31A547EC800EF4C92 /* iOS/Resources/Icons.xcassets */, + 076A9EAF2C438E1D00504BDF /* RetroArchiOS.entitlements */, ); name = iOS; path = Resources; @@ -1785,6 +1787,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = Default; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CODE_SIGN_ENTITLEMENTS = "$(IOS_CODE_SIGN_ENTITLEMENTS)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/iOS/Frameworks", @@ -1833,6 +1836,7 @@ buildSettings = { ASSETCATALOG_COMPILER_APPICON_NAME = Default; ASSETCATALOG_COMPILER_INCLUDE_ALL_APPICON_ASSETS = YES; + CODE_SIGN_ENTITLEMENTS = "$(IOS_CODE_SIGN_ENTITLEMENTS)"; FRAMEWORK_SEARCH_PATHS = ( "$(inherited)", "$(PROJECT_DIR)/iOS/Frameworks", diff --git a/pkg/apple/iOS/AppStore.xcconfig b/pkg/apple/iOS/AppStore.xcconfig index 012575d8b80..968e4ca5f16 100644 --- a/pkg/apple/iOS/AppStore.xcconfig +++ b/pkg/apple/iOS/AppStore.xcconfig @@ -14,11 +14,13 @@ MARKETING_VERSION = 1.18.3 CURRENT_PROJECT_VERSION = 12 OTHER_CFLAGS = $(inherited) -DHAVE_APPLE_STORE +OTHER_CFLAGS = $(inherited) -DHAVE_ICLOUD OTHER_CFLAGS = $(inherited) -DkRetroArchAppGroup=@\"group.com.libretro.dist.RetroArchGroup\" IOS_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch TVOS_BUNDLE_IDENTIFIER = com.libretro.dist.RetroArch +IOS_CODE_SIGN_ENTITLEMENTS = iOS/RetroArchiOS.entitlements TVOS_CODE_SIGN_ENTITLEMENTS = tvOS/RetroArchTV.entitlements IPHONEOS_DEPLOYMENT_TARGET = 14.2 diff --git a/pkg/apple/iOS/RetroArchiOS.entitlements b/pkg/apple/iOS/RetroArchiOS.entitlements new file mode 100644 index 00000000000..09ec015671e --- /dev/null +++ b/pkg/apple/iOS/RetroArchiOS.entitlements @@ -0,0 +1,16 @@ + + + + + aps-environment + production + com.apple.developer.icloud-container-identifiers + + iCloud.com.libretro.dist.RetroArch + + com.apple.developer.icloud-services + + CloudKit + + + diff --git a/pkg/apple/tvOS/RetroArchTV.entitlements b/pkg/apple/tvOS/RetroArchTV.entitlements index 689030bc567..258dd004b6f 100644 --- a/pkg/apple/tvOS/RetroArchTV.entitlements +++ b/pkg/apple/tvOS/RetroArchTV.entitlements @@ -2,6 +2,16 @@ + aps-environment + production + com.apple.developer.icloud-container-identifiers + + iCloud.com.libretro.dist.RetroArch + + com.apple.developer.icloud-services + + CloudKit + com.apple.security.application-groups group.com.libretro.dist.RetroArchGroup diff --git a/qb/config.libs.sh b/qb/config.libs.sh index 1c845375186..06ca062f0cc 100644 --- a/qb/config.libs.sh +++ b/qb/config.libs.sh @@ -316,16 +316,15 @@ check_enabled SSL BUILTINMBEDTLS 'builtin mbedtls' 'ssl is' false check_enabled SSL BUILTINBEARSSL 'builtin bearssl' 'ssl is' false if [ "$HAVE_SYSTEMMBEDTLS" = "auto" ]; then SYSTEMMBEDTLS_IS_AUTO=yes; else SYSTEMMBEDTLS_IS_AUTO=no; fi -check_lib '' SYSTEMMBEDTLS '-lmbedtls -lmbedx509 -lmbedcrypto' -check_header '' SYSTEMMBEDTLS \ - mbedtls/config.h \ - mbedtls/certs.h \ - mbedtls/debug.h \ - mbedtls/platform.h \ - mbedtls/net_sockets.h \ - mbedtls/ssl.h \ - mbedtls/ctr_drbg.h \ - mbedtls/entropy.h +check_val '' SYSTEMMBEDTLS '-lmbedtls' 'mbedtls' mbedtls 2.5.1 '' true +check_val '' SYSTEMMBEDX509 '-lmbedx509' 'mbedtls' mbedx509 2.5.1 '' true +check_val '' SYSTEMMBEDCRYPTO '-lmbedcrypto' 'mbedtls' mbedcrypto 2.5.1 '' true +if [ "$HAVE_SYSTEMMBEDTLS" = 'yes' ] && [ -z "$SYSTEMMBEDTLS_VERSION" ]; then + # Ancient versions (such as the one included in the Ubuntu version used for + # build checks) don't have this header + check_header '' SYSTEMMBEDTLS mbedtls/net_sockets.h +fi +if [ "$HAVE_SYSTEMMBEDX509" = 'no' ] || [ "$HAVE_SYSTEMMBEDCRYPTO" = 'no' ]; then HAVE_SYSTEMMBEDTLS=no; fi if [ "$SYSTEMMBEDTLS_IS_AUTO" = "yes" ] && [ "$HAVE_SYSTEMMBEDTLS" = "yes" ]; then HAVE_SYSTEMMBEDTLS=auto; fi SSL_BACKEND_CHOSEN=no diff --git a/retroarch.c b/retroarch.c index b7551a27d34..7d30f1d9688 100644 --- a/retroarch.c +++ b/retroarch.c @@ -2168,7 +2168,6 @@ struct string_list *dir_list_new_special(const char *input_dir, char ext_shaders[255]; #endif char ext_name[16]; - size_t _len = 0; const char *exts = NULL; bool recursive = false; @@ -2197,34 +2196,35 @@ struct string_list *dir_list_new_special(const char *input_dir, case DIR_LIST_SHADERS: #if defined(HAVE_CG) || defined(HAVE_GLSL) || defined(HAVE_SLANG) || defined(HAVE_HLSL) { - ext_shaders[0] = '\0'; + size_t _len = 0; + ext_shaders[0] = '\0'; if (video_shader_is_supported(RARCH_SHADER_CG)) { _len += strlcpy(ext_shaders + _len, "cgp", sizeof(ext_shaders) - _len); if (ext_shaders[_len-1] != '\0') _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); - _len += strlcpy(ext_shaders + _len, "cg", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "cg", sizeof(ext_shaders) - _len); } if (video_shader_is_supported(RARCH_SHADER_GLSL)) { if (ext_shaders[_len-1] != '\0') - _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); _len += strlcpy(ext_shaders + _len, "glslp", sizeof(ext_shaders) - _len); if (ext_shaders[_len-1] != '\0') - _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); - _len += strlcpy(ext_shaders + _len, "glsl", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "glsl", sizeof(ext_shaders) - _len); } if (video_shader_is_supported(RARCH_SHADER_SLANG)) { if (ext_shaders[_len-1] != '\0') - _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); _len += strlcpy(ext_shaders + _len, "slangp", sizeof(ext_shaders) - _len); if (ext_shaders[_len-1] != '\0') - _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); - _len += strlcpy(ext_shaders + _len, "slang", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "|", sizeof(ext_shaders) - _len); + _len += strlcpy(ext_shaders + _len, "slang", sizeof(ext_shaders) - _len); } exts = ext_shaders; @@ -5797,7 +5797,7 @@ void main_exit(void *args) #endif runloop_msg_queue_deinit(); - driver_uninit(DRIVERS_CMD_ALL, 0); + driver_uninit(DRIVERS_CMD_ALL, (enum driver_lifetime_flags)0); retro_main_log_file_deinit(); @@ -5891,7 +5891,7 @@ int rarch_main(int argc, char *argv[], void *data) frontend_driver_init_first(data); if (runloop_st->flags & RUNLOOP_FLAG_IS_INITED) - driver_uninit(DRIVERS_CMD_ALL, 0); + driver_uninit(DRIVERS_CMD_ALL, (enum driver_lifetime_flags)0); #ifdef HAVE_THREAD_STORAGE sthread_tls_create(&p_rarch->rarch_tls); @@ -7108,7 +7108,8 @@ static bool retroarch_parse_input_and_config( case 'd': { unsigned new_port; - char *tok, *save; + char *save; + char *tok = NULL; int port = 0; unsigned id = 0; char *optarg_cpy = strdup(optarg); @@ -7447,7 +7448,7 @@ static bool retroarch_parse_input_and_config( int reinit_flags = DRIVERS_CMD_ALL & ~(DRIVER_VIDEO_MASK | DRIVER_AUDIO_MASK | DRIVER_MICROPHONE_MASK | DRIVER_INPUT_MASK | DRIVER_MIDI_MASK); - drivers_init(settings, reinit_flags, 0, false); + drivers_init(settings, reinit_flags, (enum driver_lifetime_flags)0, false); retroarch_init_task_queue(); #ifdef HAVE_MENU @@ -7465,7 +7466,7 @@ static bool retroarch_parse_input_and_config( if (!explicit_menu) { task_queue_wait(NULL, NULL); - driver_uninit(DRIVERS_CMD_ALL, 0); + driver_uninit(DRIVERS_CMD_ALL, (enum driver_lifetime_flags)0); exit(0); } } @@ -7892,7 +7893,7 @@ bool retroarch_main_init(int argc, char *argv[]) #endif ); #endif - drivers_init(settings, DRIVERS_CMD_ALL, 0, verbosity_enabled); + drivers_init(settings, DRIVERS_CMD_ALL, (enum driver_lifetime_flags)0, verbosity_enabled); #ifdef HAVE_COMMAND input_driver_deinit_command(input_st); input_driver_init_command(input_st, settings); diff --git a/runloop.c b/runloop.c index 22d0d4da639..a6692198ec6 100644 --- a/runloop.c +++ b/runloop.c @@ -3110,7 +3110,7 @@ bool runloop_environment_cb(unsigned cmd, void *data) case RETRO_ENVIRONMENT_GET_AUDIO_VIDEO_ENABLE: { - enum retro_av_enable_flags result = 0; + enum retro_av_enable_flags result = (enum retro_av_enable_flags)0; video_driver_state_t *video_st = video_state_get_ptr(); audio_driver_state_t *audio_st = audio_state_get_ptr(); diff --git a/save.c b/save.c index 6dc3c51c44c..ac28e4a77f3 100644 --- a/save.c +++ b/save.c @@ -29,19 +29,19 @@ #include